add achillobator (untweaked)

This commit is contained in:
2026-06-01 00:24:06 -04:00
parent fe2dc22d33
commit d0e90b6029
49 changed files with 6580 additions and 11 deletions
@@ -110,6 +110,7 @@ public class CommonClientClass {
EntityRendererRegistry.register(ModEntities.TITANOSAURUS, TitanosaurusRenderer::new);
EntityRendererRegistry.register(ModEntities.TROODON, TroodonRenderer::new);
EntityRendererRegistry.register(ModEntities.UTAHRAPTOR, UtahraptorRenderer::new);
EntityRendererRegistry.register(ModEntities.ACHILLOBATOR, AchillobatorRenderer::new);
if (Platform.isFabric()) {
registerSpawnEggColors();
@@ -442,6 +442,9 @@ public class ModBlocks {
public static final RegistrySupplier<Block> ZHENYUANOPTERUS_EGG = registerBlock("zhenyuanopterus_egg",
() -> new EggBlock(BlockBehaviour.Properties.of().strength(4f).requiresCorrectToolForDrops(), ModEntities.ZHENYUANOPTERUS));
public static final RegistrySupplier<Block> ACHILLOBATOR_EGG = registerBlock("achillobator_egg",
() -> new EggBlock(BlockBehaviour.Properties.of().strength(4f).requiresCorrectToolForDrops(), ModEntities.ACHILLOBATOR));
public static final RegistrySupplier<Block> INCUBATED_APATOSAURUS_EGG = registerBlock("incubated_apatosaurus_egg",
@@ -663,6 +666,9 @@ public class ModBlocks {
public static final RegistrySupplier<Block> INCUBATED_ZHENYUANOPTERUS_EGG = registerBlock("incubated_zhenyuanopterus_egg",
() -> new IncubatedEggBlock(BlockBehaviour.Properties.of().strength(4f).requiresCorrectToolForDrops(), ModEntities.ZHENYUANOPTERUS));
public static final RegistrySupplier<Block> INCUBATED_ACHILLOBATOR_EGG = registerBlock("incubated_achillobator_egg",
() -> new IncubatedEggBlock(BlockBehaviour.Properties.of().strength(4f).requiresCorrectToolForDrops(), ModEntities.ACHILLOBATOR));
// --- Helper Methods ---
@@ -104,6 +104,7 @@ public class ModBlockEntities {
ModBlocks.TUPUXUARA_EGG.get(),
ModBlocks.UTAHRAPTOR_EGG.get(),
ModBlocks.ZHENYUANOPTERUS_EGG.get(),
ModBlocks.ACHILLOBATOR_EGG.get(),
ModBlocks.INCUBATED_APATOSAURUS_EGG.get(),
ModBlocks.INCUBATED_ALBERTOSAURUS_EGG.get(),
ModBlocks.INCUBATED_VELOCIRAPTOR_EGG.get(),
@@ -176,7 +177,8 @@ public class ModBlockEntities {
ModBlocks.INCUBATED_TROPEOGNATHUS_EGG.get(),
ModBlocks.INCUBATED_TUPUXUARA_EGG.get(),
ModBlocks.INCUBATED_UTAHRAPTOR_EGG.get(),
ModBlocks.INCUBATED_ZHENYUANOPTERUS_EGG.get()
ModBlocks.INCUBATED_ZHENYUANOPTERUS_EGG.get(),
ModBlocks.INCUBATED_ACHILLOBATOR_EGG.get()
).build(null));
public static final RegistrySupplier<BlockEntityType<DNAExtractorBlockEntity>> DNA_EXTRACTOR_BE =
@@ -134,6 +134,7 @@ public class ModBlockLootTableProvider {
helper.dropSelf(ModBlocks.TUPUXUARA_EGG.get());
helper.dropSelf(ModBlocks.UTAHRAPTOR_EGG.get());
helper.dropSelf(ModBlocks.ZHENYUANOPTERUS_EGG.get());
helper.dropSelf(ModBlocks.ACHILLOBATOR_EGG.get());
helper.dropSelf(ModBlocks.INCUBATED_APATOSAURUS_EGG.get());
helper.dropSelf(ModBlocks.INCUBATED_ALBERTOSAURUS_EGG.get());
@@ -208,6 +209,7 @@ public class ModBlockLootTableProvider {
helper.dropSelf(ModBlocks.INCUBATED_TUPUXUARA_EGG.get());
helper.dropSelf(ModBlocks.INCUBATED_UTAHRAPTOR_EGG.get());
helper.dropSelf(ModBlocks.INCUBATED_ZHENYUANOPTERUS_EGG.get());
helper.dropSelf(ModBlocks.INCUBATED_ACHILLOBATOR_EGG.get());
helper.dropSelf(ModBlocks.ROYAL_FERN.get());
helper.add(ModBlocks.POTTED_ROYAL_FERN.get(), helper.createPotFlowerItemTable(ModBlocks.ROYAL_FERN.get()));
@@ -196,6 +196,7 @@ public class ModBlockStateProvider {
helper.eggLike(ModBlocks.TUPUXUARA_EGG.get());
helper.eggLike(ModBlocks.UTAHRAPTOR_EGG.get());
helper.eggLike(ModBlocks.ZHENYUANOPTERUS_EGG.get());
helper.eggLike(ModBlocks.ACHILLOBATOR_EGG.get());
helper.eggLike(ModBlocks.INCUBATED_VELOCIRAPTOR_EGG.get());
helper.eggLike(ModBlocks.INCUBATED_TYRANNOSAURUS_REX_EGG.get());
@@ -270,6 +271,7 @@ public class ModBlockStateProvider {
helper.eggLike(ModBlocks.INCUBATED_TUPUXUARA_EGG.get());
helper.eggLike(ModBlocks.INCUBATED_UTAHRAPTOR_EGG.get());
helper.eggLike(ModBlocks.INCUBATED_ZHENYUANOPTERUS_EGG.get());
helper.eggLike(ModBlocks.INCUBATED_ACHILLOBATOR_EGG.get());
helper.customFenceMultipart(
ModBlocks.LOW_SECURITY_FENCE_POLE.get(),
@@ -142,7 +142,8 @@ public class ModBlockTagProvider {
ModBlocks.INCUBATED_TROPEOGNATHUS_EGG.get(),
ModBlocks.INCUBATED_TUPUXUARA_EGG.get(),
ModBlocks.INCUBATED_UTAHRAPTOR_EGG.get(),
ModBlocks.INCUBATED_ZHENYUANOPTERUS_EGG.get()
ModBlocks.INCUBATED_ZHENYUANOPTERUS_EGG.get(),
ModBlocks.INCUBATED_ACHILLOBATOR_EGG.get()
);
helper.tag(BlockTags.MINEABLE_WITH_SHOVEL);
@@ -496,5 +496,12 @@ public class ModEntityLootTableProvider {
.add(LootItem.lootTableItem(ModItems.FRESH_ZHENYUANOPTERUS_SKULL.get()))
)
);
helper.add(ModEntities.ACHILLOBATOR.get(), LootTable.lootTable()
.withPool(LootPool.lootPool()
.setRolls(ConstantValue.exactly(1))
.add(LootItem.lootTableItem(ModItems.FRESH_ACHILLOBATOR_SKULL.get()))
)
);
}
}
@@ -36,7 +36,6 @@ public class ModItemModelProvider {
helper.spawnEgg(ModItems.TRICERATOPS_SPAWN_EGG.get());
helper.spawnEgg(ModItems.TYRANNOSAURUS_REX_SPAWN_EGG.get());
helper.spawnEgg(ModItems.VELOCIRAPTOR_SPAWN_EGG.get());
helper.spawnEgg(ModItems.BARYONYX_SPAWN_EGG.get());
helper.spawnEgg(ModItems.CARNOTAURUS_SPAWN_EGG.get());
helper.spawnEgg(ModItems.CONCAVENATOR_SPAWN_EGG.get());
@@ -96,6 +95,7 @@ public class ModItemModelProvider {
helper.spawnEgg(ModItems.TITANOSAURUS_SPAWN_EGG.get());
helper.spawnEgg(ModItems.TROODON_SPAWN_EGG.get());
helper.spawnEgg(ModItems.UTAHRAPTOR_SPAWN_EGG.get());
helper.spawnEgg(ModItems.ACHILLOBATOR_SPAWN_EGG.get());
helper.basicItemModel(ModItems.FROG_MATERIAL.get());
helper.basicItemModel(ModItems.FROG_DNA.get());
@@ -186,6 +186,7 @@ public class ModItemModelProvider {
helper.basicItemModel(ModItems.TUPUXUARA_SKULL_FOSSIL.get());
helper.basicItemModel(ModItems.UTAHRAPTOR_SKULL_FOSSIL.get());
helper.basicItemModel(ModItems.ZHENYUANOPTERUS_SKULL_FOSSIL.get());
helper.basicItemModel(ModItems.ACHILLOBATOR_SKULL_FOSSIL.get());
helper.basicItemModel(ModItems.FRESH_APATOSAURUS_SKULL.get());
helper.basicItemModel(ModItems.FRESH_ALBERTOSAURUS_SKULL.get());
@@ -260,6 +261,7 @@ public class ModItemModelProvider {
helper.basicItemModel(ModItems.FRESH_TUPUXUARA_SKULL.get());
helper.basicItemModel(ModItems.FRESH_UTAHRAPTOR_SKULL.get());
helper.basicItemModel(ModItems.FRESH_ZHENYUANOPTERUS_SKULL.get());
helper.basicItemModel(ModItems.FRESH_ACHILLOBATOR_SKULL.get());
helper.basicItemModel(ModItems.APATOSAURUS_TISSUE.get());
helper.basicItemModel(ModItems.ALBERTOSAURUS_TISSUE.get());
@@ -334,6 +336,7 @@ public class ModItemModelProvider {
helper.basicItemModel(ModItems.TUPUXUARA_TISSUE.get());
helper.basicItemModel(ModItems.UTAHRAPTOR_TISSUE.get());
helper.basicItemModel(ModItems.ZHENYUANOPTERUS_TISSUE.get());
helper.basicItemModel(ModItems.ACHILLOBATOR_TISSUE.get());
helper.basicItemModel(ModItems.APATOSAURUS_DNA.get());
helper.basicItemModel(ModItems.ALBERTOSAURUS_DNA.get());
@@ -408,6 +411,7 @@ public class ModItemModelProvider {
helper.basicItemModel(ModItems.TUPUXUARA_DNA.get());
helper.basicItemModel(ModItems.UTAHRAPTOR_DNA.get());
helper.basicItemModel(ModItems.ZHENYUANOPTERUS_DNA.get());
helper.basicItemModel(ModItems.ACHILLOBATOR_DNA.get());
helper.basicItemModel(ModItems.APATOSAURUS_SYRINGE.get());
helper.basicItemModel(ModItems.ALBERTOSAURUS_SYRINGE.get());
@@ -482,6 +486,7 @@ public class ModItemModelProvider {
helper.basicItemModel(ModItems.TUPUXUARA_SYRINGE.get());
helper.basicItemModel(ModItems.UTAHRAPTOR_SYRINGE.get());
helper.basicItemModel(ModItems.ZHENYUANOPTERUS_SYRINGE.get());
helper.basicItemModel(ModItems.ACHILLOBATOR_SYRINGE.get());
helper.simpleBlockItemModel(ModBlocks.APATOSAURUS_EGG.get());
helper.simpleBlockItemModel(ModBlocks.ALBERTOSAURUS_EGG.get());
@@ -556,6 +561,7 @@ public class ModItemModelProvider {
helper.simpleBlockItemModel(ModBlocks.TUPUXUARA_EGG.get());
helper.simpleBlockItemModel(ModBlocks.UTAHRAPTOR_EGG.get());
helper.simpleBlockItemModel(ModBlocks.ZHENYUANOPTERUS_EGG.get());
helper.simpleBlockItemModel(ModBlocks.ACHILLOBATOR_EGG.get());
helper.basicItemModel(ModBlocks.LOW_SECURITY_FENCE_POLE.get().asItem());
helper.basicItemModel(ModBlocks.LOW_SECURITY_FENCE_WIRE.get().asItem());
@@ -638,6 +644,7 @@ public class ModItemModelProvider {
helper.simpleBlockItemModel(ModBlocks.INCUBATED_TUPUXUARA_EGG.get());
helper.simpleBlockItemModel(ModBlocks.INCUBATED_UTAHRAPTOR_EGG.get());
helper.simpleBlockItemModel(ModBlocks.INCUBATED_ZHENYUANOPTERUS_EGG.get());
helper.simpleBlockItemModel(ModBlocks.INCUBATED_ACHILLOBATOR_EGG.get());
helper.flowerItem(ModBlocks.ROYAL_FERN.get());
helper.flowerItem(ModBlocks.HORSETAIL_FERN.get());
@@ -87,7 +87,8 @@ public class ModItemTagProvider {
ModItems.TROPEOGNATHUS_TISSUE.get(),
ModItems.TUPUXUARA_TISSUE.get(),
ModItems.UTAHRAPTOR_TISSUE.get(),
ModItems.ZHENYUANOPTERUS_TISSUE.get()
ModItems.ZHENYUANOPTERUS_TISSUE.get(),
ModItems.ACHILLOBATOR_TISSUE.get()
);
helper.tag(ModTags.Items.DNA,
@@ -164,7 +165,8 @@ public class ModItemTagProvider {
ModItems.TROPEOGNATHUS_DNA.get(),
ModItems.TUPUXUARA_DNA.get(),
ModItems.UTAHRAPTOR_DNA.get(),
ModItems.ZHENYUANOPTERUS_DNA.get()
ModItems.ZHENYUANOPTERUS_DNA.get(),
ModItems.ACHILLOBATOR_DNA.get()
);
helper.tag(ModTags.Items.SYRINGES,
@@ -241,7 +243,8 @@ public class ModItemTagProvider {
ModItems.TROPEOGNATHUS_SYRINGE.get(),
ModItems.TUPUXUARA_SYRINGE.get(),
ModItems.UTAHRAPTOR_SYRINGE.get(),
ModItems.ZHENYUANOPTERUS_SYRINGE.get()
ModItems.ZHENYUANOPTERUS_SYRINGE.get(),
ModItems.ACHILLOBATOR_SYRINGE.get()
);
helper.tag(ModTags.Items.EGGS,
@@ -317,7 +320,8 @@ public class ModItemTagProvider {
Item.byBlock(ModBlocks.TROPEOGNATHUS_EGG.get()),
Item.byBlock(ModBlocks.TUPUXUARA_EGG.get()),
Item.byBlock(ModBlocks.UTAHRAPTOR_EGG.get()),
Item.byBlock(ModBlocks.ZHENYUANOPTERUS_EGG.get())
Item.byBlock(ModBlocks.ZHENYUANOPTERUS_EGG.get()),
Item.byBlock(ModBlocks.ACHILLOBATOR_EGG.get())
);
helper.tag(ModTags.Items.FOSSILS,
@@ -391,7 +395,8 @@ public class ModItemTagProvider {
ModItems.TROPEOGNATHUS_SKULL_FOSSIL.get(),
ModItems.TUPUXUARA_SKULL_FOSSIL.get(),
ModItems.UTAHRAPTOR_SKULL_FOSSIL.get(),
ModItems.ZHENYUANOPTERUS_SKULL_FOSSIL.get()
ModItems.ZHENYUANOPTERUS_SKULL_FOSSIL.get(),
ModItems.ACHILLOBATOR_SKULL_FOSSIL.get()
);
helper.tag(ModTags.Items.SKULLS,
@@ -468,7 +473,8 @@ public class ModItemTagProvider {
ModItems.FRESH_TROPEOGNATHUS_SKULL.get(),
ModItems.FRESH_TUPUXUARA_SKULL.get(),
ModItems.FRESH_UTAHRAPTOR_SKULL.get(),
ModItems.FRESH_ZHENYUANOPTERUS_SKULL.get()
ModItems.FRESH_ZHENYUANOPTERUS_SKULL.get(),
ModItems.FRESH_ACHILLOBATOR_SKULL.get()
);
}
}
@@ -194,6 +194,7 @@ public class ModRecipeProvider {
helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.TUPUXUARA_TISSUE.get(), ModItems.TUPUXUARA_DNA.get(), 1);
helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.UTAHRAPTOR_TISSUE.get(), ModItems.UTAHRAPTOR_DNA.get(), 1);
helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.ZHENYUANOPTERUS_TISSUE.get(), ModItems.ZHENYUANOPTERUS_DNA.get(), 1);
helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.ACHILLOBATOR_TISSUE.get(), ModItems.ACHILLOBATOR_DNA.get(), 1);
helper.fossilCleaning(ModBlocks.STONE_FOSSIL.get(), ModItems.APATOSAURUS_SKULL_FOSSIL.get(), 1);
helper.fossilCleaning(ModBlocks.DEEPSLATE_FOSSIL.get(), ModItems.VELOCIRAPTOR_SKULL_FOSSIL.get(), 1);
@@ -268,6 +269,7 @@ public class ModRecipeProvider {
helper.fossilGrinding(ModItems.TUPUXUARA_SKULL_FOSSIL.get(), ModItems.TUPUXUARA_TISSUE.get(), 1);
helper.fossilGrinding(ModItems.UTAHRAPTOR_SKULL_FOSSIL.get(), ModItems.UTAHRAPTOR_TISSUE.get(), 1);
helper.fossilGrinding(ModItems.ZHENYUANOPTERUS_SKULL_FOSSIL.get(), ModItems.ZHENYUANOPTERUS_TISSUE.get(), 1);
helper.fossilGrinding(ModItems.ACHILLOBATOR_SKULL_FOSSIL.get(), ModItems.ACHILLOBATOR_TISSUE.get(), 1);
helper.skullToTissue(ModItems.FRESH_ALBERTOSAURUS_SKULL.get(), ModItems.ALBERTOSAURUS_TISSUE.get(), 1);
helper.skullToTissue(ModItems.FRESH_APATOSAURUS_SKULL.get(), ModItems.APATOSAURUS_TISSUE.get(), 1);
@@ -342,6 +344,7 @@ public class ModRecipeProvider {
helper.skullToTissue(ModItems.FRESH_TUPUXUARA_SKULL.get(), ModItems.TUPUXUARA_TISSUE.get(), 1);
helper.skullToTissue(ModItems.FRESH_UTAHRAPTOR_SKULL.get(), ModItems.UTAHRAPTOR_TISSUE.get(), 1);
helper.skullToTissue(ModItems.FRESH_ZHENYUANOPTERUS_SKULL.get(), ModItems.ZHENYUANOPTERUS_TISSUE.get(), 1);
helper.skullToTissue(ModItems.FRESH_ACHILLOBATOR_SKULL.get(), ModItems.ACHILLOBATOR_TISSUE.get(), 1);
helper.dnaAnalyzing(ModItems.TEST_TUBE.get(), ModItems.FROG_MATERIAL.get(), ModItems.FROG_DNA.get(), 1);
@@ -434,6 +437,7 @@ public class ModRecipeProvider {
helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.TUPUXUARA_DNA.get(), ModItems.FROG_DNA.get(), ModItems.TUPUXUARA_SYRINGE.get(), 1);
helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.UTAHRAPTOR_DNA.get(), ModItems.FROG_DNA.get(), ModItems.UTAHRAPTOR_SYRINGE.get(), 1);
helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.ZHENYUANOPTERUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.ZHENYUANOPTERUS_SYRINGE.get(), 1);
helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.ACHILLOBATOR_DNA.get(), ModItems.FROG_DNA.get(), ModItems.ACHILLOBATOR_SYRINGE.get(), 1);
helper.embryoCalcification(ModItems.ALBERTOSAURUS_SYRINGE.get(), Items.EGG, ModBlocks.ALBERTOSAURUS_EGG.get(), 1);
helper.embryoCalcification(ModItems.APATOSAURUS_SYRINGE.get(), Items.EGG, ModBlocks.APATOSAURUS_EGG.get(), 1);
@@ -508,6 +512,7 @@ public class ModRecipeProvider {
helper.embryoCalcification(ModItems.TUPUXUARA_SYRINGE.get(), Items.EGG, ModBlocks.TUPUXUARA_EGG.get(), 1);
helper.embryoCalcification(ModItems.UTAHRAPTOR_SYRINGE.get(), Items.EGG, ModBlocks.UTAHRAPTOR_EGG.get(), 1);
helper.embryoCalcification(ModItems.ZHENYUANOPTERUS_SYRINGE.get(), Items.EGG, ModBlocks.ZHENYUANOPTERUS_EGG.get(), 1);
helper.embryoCalcification(ModItems.ACHILLOBATOR_SYRINGE.get(), Items.EGG, ModBlocks.ACHILLOBATOR_EGG.get(), 1);
helper.incubating(ModBlocks.APATOSAURUS_EGG.get(), ModBlocks.INCUBATED_APATOSAURUS_EGG.get(), 1);
helper.incubating(ModBlocks.ALBERTOSAURUS_EGG.get(), ModBlocks.INCUBATED_ALBERTOSAURUS_EGG.get(), 1);
@@ -582,6 +587,7 @@ public class ModRecipeProvider {
helper.incubating(ModBlocks.TUPUXUARA_EGG.get(), ModBlocks.INCUBATED_TUPUXUARA_EGG.get(), 1);
helper.incubating(ModBlocks.UTAHRAPTOR_EGG.get(), ModBlocks.INCUBATED_UTAHRAPTOR_EGG.get(), 1);
helper.incubating(ModBlocks.ZHENYUANOPTERUS_EGG.get(), ModBlocks.INCUBATED_ZHENYUANOPTERUS_EGG.get(), 1);
helper.incubating(ModBlocks.ACHILLOBATOR_EGG.get(), ModBlocks.INCUBATED_ACHILLOBATOR_EGG.get(), 1);
helper.amberRandomDNA(ModItems.TEST_TUBE.get(), ModItems.MOSQUITO_IN_AMBER.get(), ModItems.FROG_DNA.get(), 1);
}
@@ -331,6 +331,10 @@ public class ModEntities {
ENTITIES.register("utahraptor", () -> EntityType.Builder.of(UtahraptorEntity::new, MobCategory.CREATURE)
.sized(1.0f, 2.0f).build("utahraptor"));
public static final RegistrySupplier<EntityType<AchillobatorEntity>> ACHILLOBATOR =
ENTITIES.register("achillobator", () -> EntityType.Builder.of(AchillobatorEntity::new, MobCategory.CREATURE)
.sized(1.0f, 2.0f).build("achillobator"));
public static void registerAttributes() {
EntityAttributeRegistry.register(APATOSAURUS, ApatosaurusEntity::createAttributes);
EntityAttributeRegistry.register(ALBERTOSAURUS, AlbertosaurusEntity::createAttributes);
@@ -407,6 +411,7 @@ public class ModEntities {
EntityAttributeRegistry.register(TITANOSAURUS, TitanosaurusEntity::createAttributes);
EntityAttributeRegistry.register(TROODON, TroodonEntity::createAttributes);
EntityAttributeRegistry.register(UTAHRAPTOR, UtahraptorEntity::createAttributes);
EntityAttributeRegistry.register(ACHILLOBATOR, AchillobatorEntity::createAttributes);
}
public static void registerSpawnPlacements() {
@@ -489,6 +494,7 @@ public class ModEntities {
registerGroundAnimalSpawn(UTAHRAPTOR);
registerGroundAnimalSpawn(VELOCIRAPTOR);
registerGroundAnimalSpawn(ZHENYUANOPTERUS);
registerGroundAnimalSpawn(ACHILLOBATOR);
}
private static <T extends Animal> void registerGroundAnimalSpawn(RegistrySupplier<EntityType<T>> entityType) {
@@ -0,0 +1,112 @@
package net.cmr.jurassicrevived.entity.client;
import com.google.common.collect.Maps;
import net.cmr.jurassicrevived.Constants;
import net.cmr.jurassicrevived.entity.custom.AchillobatorEntity;
import net.minecraft.Util;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.Mth;
/*? if <=1.20.1 {*/
import software.bernie.geckolib.core.animation.AnimationState;
/*?} else {*/
/*import software.bernie.geckolib.animation.AnimationState;
*//*?}*/
import software.bernie.geckolib.cache.object.GeoBone;
import software.bernie.geckolib.constant.DataTickets;
import software.bernie.geckolib.model.GeoModel;
import java.util.Map;
public class AchillobatorModel extends GeoModel<AchillobatorEntity> {
private static final Map<AchillobatorVariant, ResourceLocation> LOCATION_BY_VARIANT =
Util.make(Maps.newEnumMap(AchillobatorVariant.class), map -> {
map.put(AchillobatorVariant.MALE, Constants.rl("textures/entity/achillobator.png"));
map.put(AchillobatorVariant.FEMALE, Constants.rl("textures/entity/achillobator_female.png"));
});
// Model-local "currently applied" offsets; cleared before each entity render
private float[] appliedYaw = null;
private float[] appliedRoll = null;
@Override
public ResourceLocation getModelResource(AchillobatorEntity animatable) {
return Constants.rl("geo/achillobator.geo.json");
}
@Override
public ResourceLocation getTextureResource(AchillobatorEntity animatable) {
return LOCATION_BY_VARIANT.get(animatable.getVariant());
}
@Override
public ResourceLocation getAnimationResource(AchillobatorEntity animatable) {
return Constants.rl("animations/achillobator.animation.json");
}
@Override
public void setCustomAnimations(AchillobatorEntity entity, long id, AnimationState<AchillobatorEntity> state) {
super.setCustomAnimations(entity, id, state);
String[] tailBones = { "tail1", "tail2", "tail3", "tail4", "tail5", "tail6" };
int n = tailBones.length;
if (appliedYaw == null || appliedYaw.length != n) {
appliedYaw = new float[n];
appliedRoll = new float[n];
}
// 1) Clear previous offsets (from the last entity rendered with this model instance)
for (int i = 0; i < n; i++) {
if (appliedYaw[i] == 0.0f && appliedRoll[i] == 0.0f) continue;
GeoBone bone = (GeoBone) getAnimationProcessor().getBone(tailBones[i]);
if (bone == null) continue;
if (appliedYaw[i] != 0.0f) bone.setRotY(bone.getRotY() - appliedYaw[i]);
if (appliedRoll[i] != 0.0f) bone.setRotZ(bone.getRotZ() - appliedRoll[i]);
appliedYaw[i] = 0.0f;
appliedRoll[i] = 0.0f;
}
// 2) Interpolated sway for extra smoothness between ticks
float sway = entity.getTailSwayOffset(state.getPartialTick()); // [-1, 1]
// Tuning
float maxYawDeg = 22.0f; // increased max sweep
float swayGain = 1.35f; // amplifies overall power
float rollFraction = 0.40f; // slightly stronger roll for heft
float deg2rad = (float)Math.PI / 180f;
// Direction: positive sway (left turn) -> tail swings right (negative yaw)
// Flip the sign here if the sway feels inverted
float baseYaw = sway * maxYawDeg * deg2rad;
float baseRoll = -baseYaw * rollFraction;
float[] weights = { 1.00f, 0.78f, 0.58f, 0.42f, 0.30f, 0.22f };
for (int i = 0; i < n; i++) {
GeoBone bone = (GeoBone) getAnimationProcessor().getBone(tailBones[i]);
if (bone == null) continue;
float w = weights[i];
float yaw = baseYaw * w;
float roll = baseRoll * w;
// OVERRIDE animations on Y/Z only: keep the model's predefined X bend intact
// Do NOT reset rotX here, so the upward bend stays
bone.setRotY(yaw);
bone.setRotZ(roll);
appliedYaw[i] = yaw;
appliedRoll[i] = roll;
}
GeoBone head = (GeoBone) getAnimationProcessor().getBone("body1");
if (head != null) {
var entityData = state.getData(DataTickets.ENTITY_MODEL_DATA);
float clampedYawDeg = Mth.clamp(entityData.netHeadYaw(), -20.0f, 20.0f);
head.setRotY(clampedYawDeg * Mth.DEG_TO_RAD);
}
}
}
@@ -0,0 +1,26 @@
package net.cmr.jurassicrevived.entity.client;
import com.mojang.blaze3d.vertex.PoseStack;
import net.cmr.jurassicrevived.entity.custom.AchillobatorEntity;
import net.minecraft.client.renderer.entity.EntityRendererProvider;
import net.minecraft.util.Mth;
import software.bernie.geckolib.cache.object.BakedGeoModel;
import software.bernie.geckolib.renderer.GeoEntityRenderer;
public class AchillobatorRenderer extends GeoEntityRenderer<AchillobatorEntity> {
private final float animalScale = 1.3F;
public AchillobatorRenderer(EntityRendererProvider.Context renderManager) {
super(renderManager, new AchillobatorModel());
}
@Override
public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, AchillobatorEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) {
poseStack.scale(animalScale, animalScale, animalScale);
if(animatable.isBaby()) {
float growthProgress = Mth.clamp((24000.0F + animatable.getSyncedAge()) / 24000.0F, 0.0F, 1.0F);
float scale = Mth.lerp(growthProgress, 0.2F, 1.0F);
poseStack.scale(scale, scale, scale);
}
}
}
@@ -0,0 +1,26 @@
package net.cmr.jurassicrevived.entity.client;
import java.util.Arrays;
import java.util.Comparator;
public enum AchillobatorVariant {
MALE(0),
FEMALE(1);
private static final AchillobatorVariant[] BY_ID = Arrays.stream(values()).sorted(
Comparator.comparingInt(AchillobatorVariant::getId)).toArray(AchillobatorVariant[]::new);
private final int id;
AchillobatorVariant(int id) {
this.id = id;
}
public int getId() {
return id;
}
public static AchillobatorVariant byId(int id) {
return BY_ID[id % BY_ID.length];
}
}
@@ -0,0 +1,319 @@
package net.cmr.jurassicrevived.entity.custom;
import net.cmr.jurassicrevived.block.ModBlocks;
import net.cmr.jurassicrevived.entity.ModEntities;
import net.cmr.jurassicrevived.entity.ai.DinoData;
import net.cmr.jurassicrevived.entity.ai.DinoEntityBase;
import net.cmr.jurassicrevived.entity.ai.IDinoData;
import net.cmr.jurassicrevived.entity.client.AchillobatorVariant;
import net.cmr.jurassicrevived.sound.ModSounds;
import net.minecraft.Util;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.syncher.EntityDataAccessor;
import net.minecraft.network.syncher.EntityDataSerializers;
import net.minecraft.network.syncher.SynchedEntityData;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.util.Mth;
import net.minecraft.world.DifficultyInstance;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.entity.*;
import net.minecraft.world.entity.ai.attributes.AttributeSupplier;
import net.minecraft.world.entity.ai.attributes.Attributes;
import net.minecraft.world.entity.ai.attributes.DefaultAttributes;
import net.minecraft.world.entity.animal.Animal;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.ServerLevelAccessor;
import net.minecraft.world.level.block.Block;
import org.jetbrains.annotations.Nullable;
import software.bernie.geckolib.animatable.GeoEntity;
/*? if <=1.20.1 {*/
import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache;
import software.bernie.geckolib.core.animatable.instance.SingletonAnimatableInstanceCache;
import software.bernie.geckolib.core.animation.AnimatableManager;
import software.bernie.geckolib.core.animation.Animation;
import software.bernie.geckolib.core.animation.AnimationController;
import software.bernie.geckolib.core.animation.RawAnimation;
import software.bernie.geckolib.core.object.PlayState;
/*?} else {*/
/*import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache;
import software.bernie.geckolib.animatable.instance.SingletonAnimatableInstanceCache;
import software.bernie.geckolib.animation.*;
*//*?}*/
public class AchillobatorEntity extends DinoEntityBase implements GeoEntity {
private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);
private static final EntityDataAccessor<Integer> VARIANT =
SynchedEntityData.defineId(AchillobatorEntity.class, EntityDataSerializers.INT);
private static final EntityDataAccessor<Integer> DATA_SYNCED_AGE =
SynchedEntityData.defineId(AchillobatorEntity.class, EntityDataSerializers.INT);
// Procedural tail sway state (client-side use for rendering)
private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1]
private float tailSwayVelocity; // Internal velocity for spring-damper
private float tailSwayPrev; // Previous frame value for interpolation
public AchillobatorEntity(EntityType<? extends Animal> pEntityType, Level pLevel) {
super(pEntityType, pLevel);
this.dinoData = new DinoData(
getAIConfig().maxHunger(),
getAIConfig().maxThirst(),
IDinoData.Mood.NEUTRAL,
IDinoData.Aggression.TERRITORIAL,
0.75f,
IDinoData.DietaryClassification.CARNIVORE,
IDinoData.Type.TERRESTRIAL,
IDinoData.Group.THEROPOD,
IDinoData.BirthType.EGG_LAYING,
IDinoData.ActivityPattern.CATHEMERAL
);
}
@Override
public boolean isCarnivore() {
return true;
}
@Override
public boolean isMarine() {
return false;
}
@Override
public boolean isAmphibious() {
return false;
}
@Override
public Block getEggBlock() {
return ModBlocks.INCUBATED_ACHILLOBATOR_EGG.get();
}
@Override
public DinoAIConfig getAIConfig() {
return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20);
}
public static AttributeSupplier.Builder createAttributes() {
return Animal.createLivingAttributes()
.add(Attributes.MAX_HEALTH, 55D)
.add(Attributes.MOVEMENT_SPEED, 0.3D)
.add(Attributes.ARMOR, 0D)
.add(Attributes.FOLLOW_RANGE, 32D)
.add(Attributes.KNOCKBACK_RESISTANCE, 0D)
.add(Attributes.ATTACK_KNOCKBACK, 0D)
.add(Attributes.ATTACK_DAMAGE, 16D);
}
@Nullable
@Override
public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) {
AgeableMob child = ModEntities.ACHILLOBATOR.get().create(pLevel);
if (child instanceof AchillobatorEntity baby) {
AchillobatorVariant randomVariant = Util.getRandom(AchillobatorVariant.values(), this.random);
baby.setVariant(randomVariant);
}
return child;
}
@Override
public boolean doHurtTarget(Entity target) {
boolean hit = super.doHurtTarget(target);
if (!level().isClientSide && hit && target instanceof LivingEntity) {
if (this.level() instanceof ServerLevel serverLevel) {
this.triggerAnim("attackController", "attack");
this.playSound(ModSounds.ACHILLOBATOR_ATTACK.get(), 1.0F, 1.0F);
}
}
return hit;
}
@Override
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
controllers.add(new AnimationController<>(this, "Walk/Run/Idle", 5, state -> {
if (state.isMoving())
return state.setAndContinue(AchillobatorEntity.this.isSprinting() ? RawAnimation.begin().then("anim.achillobator.run", Animation.LoopType.LOOP) : RawAnimation.begin().then("anim.achillobator.walk", Animation.LoopType.LOOP));
return state.setAndContinue(RawAnimation.begin().then("anim.achillobator.idle", Animation.LoopType.LOOP));
}));
controllers.add(new AnimationController<>(this, "attackController", 5, state -> PlayState.STOP)
.triggerableAnim("attack", RawAnimation.begin().then("anim.achillobator.attack", Animation.LoopType.PLAY_ONCE)));
controllers.add(new AnimationController<>(this, "mouthController", 5, state -> PlayState.STOP)
.triggerableAnim("mouth", RawAnimation.begin().then("anim.achillobator.mouth", Animation.LoopType.PLAY_ONCE)));
}
private float getSignedTurnDelta() {
// Only consider the body (torso) rotation so head look does not affect tail sway
return Mth.wrapDegrees(this.yBodyRot - this.yBodyRotO);
}
private int mouthAnimCooldown = 0;
@Override
public void tick() {
super.tick();
if (!level().isClientSide) {
this.entityData.set(DATA_SYNCED_AGE, this.getAge());
var maxHealthAttr = getAttribute(Attributes.MAX_HEALTH);
if (maxHealthAttr != null) {
double baseAdult = DefaultAttributes.getSupplier((EntityType<? extends LivingEntity>) this.getType()).getValue(Attributes.MAX_HEALTH);
double desired = this.isBaby() ? baseAdult * 0.10D : baseAdult;
if (maxHealthAttr.getBaseValue() != desired) {
double oldMax = maxHealthAttr.getBaseValue();
double healthRatio = this.getHealth() / (float) oldMax;
maxHealthAttr.setBaseValue(desired);
this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F)));
}
}
}
if (!level().isClientSide) {
if (mouthAnimCooldown > 0) {
mouthAnimCooldown--;
} else {
this.triggerAnim("mouthController", "mouth");
this.playSound(ModSounds.ACHILLOBATOR_CALL.get(), 1.0F, 1.0F);
// 30s60s in ticks
mouthAnimCooldown = this.random.nextInt(1200 - 600 + 1) + 600;
}
}
if (level().isClientSide) {
// Capture previous for smooth interpolation between ticks
this.tailSwayPrev = this.tailSwayOffset;
updateProceduralTailSway();
}
}
private void updateProceduralTailSway() {
// Turn input derived from rotation deltas; works even when standing still and turning
float turnDegrees = getSignedTurnDelta();
// Deadzone to ignore tiny jitter so the tail can return to center cleanly
float deadzoneDeg = 0.6f; // smaller deadzone for more responsiveness
float turnInput = 0.0f;
if (Math.abs(turnDegrees) >= deadzoneDeg) {
// Higher sensitivity so small in-place turns still affect the model
turnInput = Mth.clamp(turnDegrees / 15.0f, -1.0f, 1.0f);
}
// Target offset: keep intuitive sign (positive input -> positive sway)
float target = turnInput;
// One-pole low-pass (no bounce). Larger alpha => snappier and less "stiff".
float alpha = 0.24f; // try 0.200.30 to taste
tailSwayOffset += (target - tailSwayOffset) * alpha;
// Snap tiny residuals to zero so it visibly settles
if (Math.abs(tailSwayOffset) < 0.003f) {
tailSwayOffset = 0.0f;
}
// No oscillation velocity retained
tailSwayVelocity = 0.0f;
tailSwayOffset = Mth.clamp(tailSwayOffset, -1.5f, 1.5f);
}
// Expose to the model for bone rotation
public float getTailSwayOffset() {
return tailSwayOffset;
}
// Interpolated sway for smooth rendering between ticks
public float getTailSwayOffset(float partialTick) {
return Mth.lerp(Mth.clamp(partialTick, 0.0f, 1.0f), tailSwayPrev, tailSwayOffset);
}
/*? if <=1.20.1 {*/
@Override
protected void defineSynchedData() {
super.defineSynchedData();
this.entityData.define(VARIANT, 0);
this.entityData.define(DATA_SYNCED_AGE, 0);
}
/*?} else {*/
/*@Override
protected void defineSynchedData(SynchedEntityData.Builder pBuilder) {
super.defineSynchedData(pBuilder);
pBuilder.define(VARIANT, 0);
pBuilder.define(DATA_SYNCED_AGE, 0);
}
*//*?}*/
public int getSyncedAge() {
return this.entityData.get(DATA_SYNCED_AGE);
}
public int getTypeVariant() {
return this.entityData.get(VARIANT);
}
public AchillobatorVariant getVariant() {
return AchillobatorVariant.byId(this.getTypeVariant() & 255);
}
private void setVariant(AchillobatorVariant variant) {
this.entityData.set(VARIANT, variant.getId() & 255);
}
@Override
public boolean canMate(Animal other) {
if (!super.canMate(other)) return false;
if (!(other instanceof AchillobatorEntity that)) return false;
return this.getVariant() != that.getVariant();
}
@Override
public void addAdditionalSaveData(CompoundTag pCompound) {
super.addAdditionalSaveData(pCompound);
pCompound.putInt("Variant", this.getTypeVariant());
}
@Override
public void readAdditionalSaveData(CompoundTag pCompound) {
super.readAdditionalSaveData(pCompound);
this.entityData.set(VARIANT, pCompound.getInt("Variant"));
}
/*? if <=1.20.1 {*/
@Override
public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) {
AchillobatorVariant variant = Util.getRandom(AchillobatorVariant.values(), this.random);
this.setVariant(variant);
return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag);
}
/*?} else {*/
/*@Override
public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) {
AchillobatorVariant variant = Util.getRandom(AchillobatorVariant.values(), this.random);
this.setVariant(variant);
return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);
}
*//*?}*/
@Override
public AnimatableInstanceCache getAnimatableInstanceCache() {
return cache;
}
@Override
protected @Nullable SoundEvent getHurtSound(DamageSource damageSource) {
return ModSounds.ACHILLOBATOR_HURT.get();
}
@Override
protected @Nullable SoundEvent getDeathSound() {
return ModSounds.ACHILLOBATOR_DEATH.get();
}
@Override
protected @Nullable SoundEvent getAmbientSound() {
return ModSounds.ACHILLOBATOR_CALL.get();
}
}
@@ -124,6 +124,7 @@ public class ModCreativeTabs {
builder.icon(() -> new ItemStack(ModItems.TYRANNOSAURUS_REX_DNA.get().asItem()));
builder.displayItems((params, output) -> {
// Skull fossils (alphabetical)
output.accept(ModItems.ACHILLOBATOR_SKULL_FOSSIL.get());
output.accept(ModItems.ALBERTOSAURUS_SKULL_FOSSIL.get());
output.accept(ModItems.ALLOSAURUS_SKULL_FOSSIL.get());
output.accept(ModItems.ALVAREZSAURUS_SKULL_FOSSIL.get());
@@ -196,6 +197,7 @@ public class ModCreativeTabs {
output.accept(ModItems.ZHENYUANOPTERUS_SKULL_FOSSIL.get());
// Fresh skulls (alphabetical)
output.accept(ModItems.FRESH_ACHILLOBATOR_SKULL.get());
output.accept(ModItems.FRESH_ALBERTOSAURUS_SKULL.get());
output.accept(ModItems.FRESH_ALLOSAURUS_SKULL.get());
output.accept(ModItems.FRESH_ALVAREZSAURUS_SKULL.get());
@@ -270,6 +272,7 @@ public class ModCreativeTabs {
output.accept(ModItems.FRESH_ZHENYUANOPTERUS_SKULL.get());
// Tissue (alphabetical)
output.accept(ModItems.ACHILLOBATOR_TISSUE.get());
output.accept(ModItems.ALBERTOSAURUS_TISSUE.get());
output.accept(ModItems.ALLOSAURUS_TISSUE.get());
output.accept(ModItems.ALVAREZSAURUS_TISSUE.get());
@@ -345,6 +348,7 @@ public class ModCreativeTabs {
output.accept(ModItems.ZHENYUANOPTERUS_TISSUE.get());
// DNA (alphabetical)
output.accept(ModItems.ACHILLOBATOR_DNA.get());
output.accept(ModItems.ALBERTOSAURUS_DNA.get());
output.accept(ModItems.ALLOSAURUS_DNA.get());
output.accept(ModItems.ALVAREZSAURUS_DNA.get());
@@ -420,6 +424,7 @@ public class ModCreativeTabs {
output.accept(ModItems.ZHENYUANOPTERUS_DNA.get());
// Syringes (alphabetical)
output.accept(ModItems.ACHILLOBATOR_SYRINGE.get());
output.accept(ModItems.ALBERTOSAURUS_SYRINGE.get());
output.accept(ModItems.ALLOSAURUS_SYRINGE.get());
output.accept(ModItems.ALVAREZSAURUS_SYRINGE.get());
@@ -495,6 +500,7 @@ public class ModCreativeTabs {
output.accept(ModItems.ZHENYUANOPTERUS_SYRINGE.get());
// Eggs (alphabetical)
output.accept(ModBlocks.ACHILLOBATOR_EGG.get());
output.accept(ModBlocks.ALBERTOSAURUS_EGG.get());
output.accept(ModBlocks.ALLOSAURUS_EGG.get());
output.accept(ModBlocks.ALVAREZSAURUS_EGG.get());
@@ -575,6 +581,7 @@ public class ModCreativeTabs {
builder.title(Component.translatable("itemGroup." + Constants.MOD_ID + ".dino_tab"));
builder.icon(() -> new ItemStack(ModItems.TYRANNOSAURUS_REX_SPAWN_EGG.get().asItem()));
builder.displayItems((params, output) -> {
output.accept(ModItems.ACHILLOBATOR_SPAWN_EGG.get());
output.accept(ModItems.ALBERTOSAURUS_SPAWN_EGG.get());
output.accept(ModItems.ALLOSAURUS_SPAWN_EGG.get());
output.accept(ModItems.ALVAREZSAURUS_SPAWN_EGG.get());
@@ -179,6 +179,8 @@ public class ModItems {
() -> new CustomGenderedSpawnEggItem(ModEntities.TROODON, 0xff414632, 0xff640600, new Item.Properties()));
public static final RegistrySupplier<Item> UTAHRAPTOR_SPAWN_EGG = ITEMS.register("utahraptor_spawn_egg",
() -> new CustomGenderedSpawnEggItem(ModEntities.UTAHRAPTOR, 0xff474131, 0xffdad8db, new Item.Properties()));
public static final RegistrySupplier<Item> ACHILLOBATOR_SPAWN_EGG = ITEMS.register("achillobator_spawn_egg",
() -> new CustomGenderedSpawnEggItem(ModEntities.ACHILLOBATOR, 0xffcbb791, 0xff8e4338, new Item.Properties()));
public static final RegistrySupplier<Item> TEST_TUBE = ITEMS.register("test_tube", () -> new Item(new Item.Properties().stacksTo(16)));
@@ -262,6 +264,7 @@ public class ModItems {
public static final RegistrySupplier<Item> TUPUXUARA_SKULL_FOSSIL = ITEMS.register("tupuxuara_skull_fossil", () -> new Item(new Item.Properties().stacksTo(16)));
public static final RegistrySupplier<Item> UTAHRAPTOR_SKULL_FOSSIL = ITEMS.register("utahraptor_skull_fossil", () -> new Item(new Item.Properties().stacksTo(16)));
public static final RegistrySupplier<Item> ZHENYUANOPTERUS_SKULL_FOSSIL = ITEMS.register("zhenyuanopterus_skull_fossil", () -> new Item(new Item.Properties().stacksTo(16)));
public static final RegistrySupplier<Item> ACHILLOBATOR_SKULL_FOSSIL = ITEMS.register("achillobator_skull_fossil", () -> new Item(new Item.Properties().stacksTo(16)));
public static final RegistrySupplier<Item> FRESH_VELOCIRAPTOR_SKULL = ITEMS.register("fresh_velociraptor_skull", () -> new Item(new Item.Properties().stacksTo(16)));
@@ -337,6 +340,7 @@ public class ModItems {
public static final RegistrySupplier<Item> FRESH_TUPUXUARA_SKULL = ITEMS.register("fresh_tupuxuara_skull", () -> new Item(new Item.Properties().stacksTo(16)));
public static final RegistrySupplier<Item> FRESH_UTAHRAPTOR_SKULL = ITEMS.register("fresh_utahraptor_skull", () -> new Item(new Item.Properties().stacksTo(16)));
public static final RegistrySupplier<Item> FRESH_ZHENYUANOPTERUS_SKULL = ITEMS.register("fresh_zhenyuanopterus_skull", () -> new Item(new Item.Properties().stacksTo(16)));
public static final RegistrySupplier<Item> FRESH_ACHILLOBATOR_SKULL = ITEMS.register("fresh_achillobator_skull", () -> new Item(new Item.Properties().stacksTo(16)));
// Tissue group
@@ -413,6 +417,7 @@ public class ModItems {
public static final RegistrySupplier<Item> TUPUXUARA_TISSUE = ITEMS.register("tupuxuara_tissue", () -> new Item(new Item.Properties().stacksTo(8).rarity(Rarity.EPIC)));
public static final RegistrySupplier<Item> UTAHRAPTOR_TISSUE = ITEMS.register("utahraptor_tissue", () -> new Item(new Item.Properties().stacksTo(8).rarity(Rarity.EPIC)));
public static final RegistrySupplier<Item> ZHENYUANOPTERUS_TISSUE = ITEMS.register("zhenyuanopterus_tissue", () -> new Item(new Item.Properties().stacksTo(8).rarity(Rarity.EPIC)));
public static final RegistrySupplier<Item> ACHILLOBATOR_TISSUE = ITEMS.register("achillobator_tissue", () -> new Item(new Item.Properties().stacksTo(8).rarity(Rarity.EPIC)));
// DNA group
@@ -489,6 +494,7 @@ public class ModItems {
public static final RegistrySupplier<Item> TUPUXUARA_DNA = ITEMS.register("tupuxuara_dna", () -> new Item(new Item.Properties().stacksTo(8).rarity(Rarity.RARE)));
public static final RegistrySupplier<Item> UTAHRAPTOR_DNA = ITEMS.register("utahraptor_dna", () -> new Item(new Item.Properties().stacksTo(8).rarity(Rarity.RARE)));
public static final RegistrySupplier<Item> ZHENYUANOPTERUS_DNA = ITEMS.register("zhenyuanopterus_dna", () -> new Item(new Item.Properties().stacksTo(8).rarity(Rarity.RARE)));
public static final RegistrySupplier<Item> ACHILLOBATOR_DNA = ITEMS.register("achillobator_dna", () -> new Item(new Item.Properties().stacksTo(8).rarity(Rarity.RARE)));
// Syringe group
@@ -565,6 +571,7 @@ public class ModItems {
public static final RegistrySupplier<Item> TUPUXUARA_SYRINGE = ITEMS.register("tupuxuara_syringe", () -> new Item(new Item.Properties().stacksTo(8).rarity(Rarity.UNCOMMON)));
public static final RegistrySupplier<Item> UTAHRAPTOR_SYRINGE = ITEMS.register("utahraptor_syringe", () -> new Item(new Item.Properties().stacksTo(8).rarity(Rarity.UNCOMMON)));
public static final RegistrySupplier<Item> ZHENYUANOPTERUS_SYRINGE = ITEMS.register("zhenyuanopterus_syringe", () -> new Item(new Item.Properties().stacksTo(8).rarity(Rarity.UNCOMMON)));
public static final RegistrySupplier<Item> ACHILLOBATOR_SYRINGE = ITEMS.register("achillobator_syringe", () -> new Item(new Item.Properties().stacksTo(8).rarity(Rarity.UNCOMMON)));
public static void register() {
@@ -351,6 +351,11 @@ public class ModSounds {
public static final Supplier<SoundEvent> ZHENYUANOPTERUS_HURT = registerSoundEvent("zhenyuanopterus_hurt");
public static final Supplier<SoundEvent> ZHENYUANOPTERUS_DEATH = registerSoundEvent("zhenyuanopterus_death");
public static final Supplier<SoundEvent> ACHILLOBATOR_CALL = registerSoundEvent("achillobator_call");
public static final Supplier<SoundEvent> ACHILLOBATOR_ATTACK = registerSoundEvent("achillobator_attack");
public static final Supplier<SoundEvent> ACHILLOBATOR_HURT = registerSoundEvent("achillobator_hurt");
public static final Supplier<SoundEvent> ACHILLOBATOR_DEATH = registerSoundEvent("achillobator_death");
private static Supplier<SoundEvent> registerSoundEvent(String name) {
ResourceLocation id = Constants.rl(name);
@@ -83,7 +83,8 @@ public final class ModSpawnDefinitions {
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)
spawn("zhenyuanopterus", ModEntities.ZHENYUANOPTERUS, 7, 2, 5, BiomeTags.IS_BEACH, BiomeTags.IS_MOUNTAIN),
spawn("achillobator", ModEntities.ACHILLOBATOR, 12, 1, 2, BiomeTags.IS_TAIGA)
);
@SafeVarargs