diff --git a/common/src/main/java/net/cmr/jurassicrevived/block/ModBlocks.java b/common/src/main/java/net/cmr/jurassicrevived/block/ModBlocks.java index c5ca39c..f4a06e1 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/block/ModBlocks.java +++ b/common/src/main/java/net/cmr/jurassicrevived/block/ModBlocks.java @@ -207,6 +207,8 @@ public class ModBlocks { () -> new Block(BlockBehaviour.Properties.of().strength(4f).requiresCorrectToolForDrops())); public static final RegistrySupplier DEEPSLATE_ICE_SHARD_ORE = registerBlock("deepslate_ice_shard_ore", () -> new Block(BlockBehaviour.Properties.of().strength(4f).requiresCorrectToolForDrops())); + public static final RegistrySupplier PERMAFROST = registerBlock("permafrost", + () -> new Block(BlockBehaviour.Properties.of().strength(4f).requiresCorrectToolForDrops())); public static final RegistrySupplier REINFORCED_STONE = registerBlock("reinforced_stone", () -> new Block(BlockBehaviour.Properties.of().strength(4f).requiresCorrectToolForDrops())); diff --git a/common/src/main/java/net/cmr/jurassicrevived/datagen/ModBlockLootTableProvider.java b/common/src/main/java/net/cmr/jurassicrevived/datagen/ModBlockLootTableProvider.java index 08ce2b1..6e3794e 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/datagen/ModBlockLootTableProvider.java +++ b/common/src/main/java/net/cmr/jurassicrevived/datagen/ModBlockLootTableProvider.java @@ -20,7 +20,8 @@ public class ModBlockLootTableProvider { void dropSelf(Block block); void add(Block block, LootTable.Builder builder); LootTable.Builder createMultipleOreDrops(Block block, Item item, float minDrops, float maxDrops); - LootTable.Builder createPotFlowerItemTable(Block block); + LootTable.Builder createRandomOreDrops(Block block, Item silkTouchDrop, Item firstDrop, Item secondDrop, float minRolls, float maxRolls, double firstDropChance); + LootTable.Builder createPotFlowerItemTable(Block block); } public static void registerBlockLootTables(BlockLootHelper helper) { @@ -53,6 +54,8 @@ public class ModBlockLootTableProvider { helper.createMultipleOreDrops(ModBlocks.AMBER_ORE.get(), ModItems.MOSQUITO_IN_AMBER.get(),1, 1)); helper.add(ModBlocks.DEEPSLATE_ICE_SHARD_ORE.get(), helper.createMultipleOreDrops(ModBlocks.DEEPSLATE_ICE_SHARD_ORE.get(), ModItems.FROZEN_LEECH.get(),1, 1)); + helper.add(ModBlocks.PERMAFROST.get(), + helper.createMultipleOreDrops(ModBlocks.PERMAFROST.get(), ModItems.FROZEN_BONE.get(),1, 1)); helper.dropSelf(ModBlocks.REINFORCED_STONE.get()); helper.dropSelf(ModBlocks.REINFORCED_STONE_BRICKS.get()); diff --git a/common/src/main/java/net/cmr/jurassicrevived/datagen/ModBlockStateProvider.java b/common/src/main/java/net/cmr/jurassicrevived/datagen/ModBlockStateProvider.java index ea8bfc9..cf8cc97 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/datagen/ModBlockStateProvider.java +++ b/common/src/main/java/net/cmr/jurassicrevived/datagen/ModBlockStateProvider.java @@ -12,6 +12,8 @@ import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.block.state.properties.BooleanProperty; import net.minecraft.world.level.block.state.properties.EnumProperty; +import java.util.List; + public class ModBlockStateProvider { public interface BlockStateHelper { @@ -25,7 +27,9 @@ public class ModBlockStateProvider { void pottedPlantBlock(Block block, ResourceLocation plantTexture); void blockWithItem(Block block); - void horizontalFacingWithItem(Block block); + void blockWithItem(Block block, ResourceLocation sideTexture, ResourceLocation bottomTexture, ResourceLocation topTexture); + void randomTextureBlockWithItem(Block block, List textures); + void horizontalFacingWithItem(Block block); void horizontalFacingLitWithItem(Block block); void horizontalFacingLitNoBlockstateWithItem(Block block); void eggLike(Block block); @@ -68,10 +72,22 @@ public class ModBlockStateProvider { helper.blockWithItem(ModBlocks.SMOOTH_GYPSUM_STONE.get()); helper.blockWithItem(ModBlocks.CHISELED_GYPSUM_STONE.get()); - helper.blockWithItem(ModBlocks.STONE_FOSSIL.get()); - helper.blockWithItem(ModBlocks.DEEPSLATE_FOSSIL.get()); + helper.randomTextureBlockWithItem(ModBlocks.STONE_FOSSIL.get(), List.of( + Constants.rl("block/stone_fossil_egg"), + Constants.rl("block/stone_fossil_rib"), + Constants.rl("block/stone_fossil_skull") + )); + helper.randomTextureBlockWithItem(ModBlocks.DEEPSLATE_FOSSIL.get(), List.of( + Constants.rl("block/deepslate_fossil_egg"), + Constants.rl("block/deepslate_fossil_rib"), + Constants.rl("block/deepslate_fossil_skull") + )); helper.blockWithItem(ModBlocks.AMBER_ORE.get()); helper.blockWithItem(ModBlocks.DEEPSLATE_ICE_SHARD_ORE.get()); + helper.blockWithItem(ModBlocks.PERMAFROST.get(), + Constants.rl("block/permafrost_side"), + Constants.rl("block/permafrost_bottom"), + Constants.rl("block/permafrost_top")); helper.blockWithItem(ModBlocks.REINFORCED_STONE.get()); helper.blockWithItem(ModBlocks.REINFORCED_STONE_BRICKS.get()); diff --git a/common/src/main/java/net/cmr/jurassicrevived/datagen/ModBlockTagProvider.java b/common/src/main/java/net/cmr/jurassicrevived/datagen/ModBlockTagProvider.java index f82a661..143ef8e 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/datagen/ModBlockTagProvider.java +++ b/common/src/main/java/net/cmr/jurassicrevived/datagen/ModBlockTagProvider.java @@ -148,7 +148,9 @@ public class ModBlockTagProvider { ModBlocks.INCUBATED_CHILESAURUS_EGG.get() ); - helper.tag(BlockTags.MINEABLE_WITH_SHOVEL); + helper.tag(BlockTags.MINEABLE_WITH_SHOVEL, + ModBlocks.PERMAFROST.get() + ); helper.tag(BlockTags.NEEDS_STONE_TOOL, ModBlocks.STONE_FOSSIL.get(), diff --git a/common/src/main/java/net/cmr/jurassicrevived/datagen/ModItemModelProvider.java b/common/src/main/java/net/cmr/jurassicrevived/datagen/ModItemModelProvider.java index a7cca04..f472228 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/datagen/ModItemModelProvider.java +++ b/common/src/main/java/net/cmr/jurassicrevived/datagen/ModItemModelProvider.java @@ -109,6 +109,7 @@ public class ModItemModelProvider { helper.basicItemModel(ModItems.CRUSHED_FOSSIL.get()); helper.basicItemModel(ModItems.MOSQUITO_IN_AMBER.get()); helper.basicItemModel(ModItems.FROZEN_LEECH.get()); + helper.basicItemModel(ModItems.FROZEN_BONE.get()); helper.basicItemModel(ModItems.CABLE.get()); helper.basicItemModel(ModItems.SCREEN.get()); helper.basicItemModel(ModItems.PROCESSOR.get()); diff --git a/common/src/main/java/net/cmr/jurassicrevived/datagen/ModWorldgenProvider.java b/common/src/main/java/net/cmr/jurassicrevived/datagen/ModWorldgenProvider.java index 64faa90..ccd8faa 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/datagen/ModWorldgenProvider.java +++ b/common/src/main/java/net/cmr/jurassicrevived/datagen/ModWorldgenProvider.java @@ -42,18 +42,22 @@ public class ModWorldgenProvider implements DataProvider { )) .toArray(CompletableFuture[]::new); - return CompletableFuture.allOf( + CompletableFuture allGenerators = CompletableFuture.allOf( java.util.stream.Stream.concat( java.util.Arrays.stream(oreFutures), java.util.Arrays.stream(spawnFutures) ).toArray(CompletableFuture[]::new) ); + + return CompletableFuture.allOf(allGenerators, saveIsSnowyFallbackTag(cachedOutput)); + } private CompletableFuture saveForgeAddFeatureBiomeModifier(CachedOutput cachedOutput, ModWorldgenDefinitions.OreDefinition ore) { JsonObject root = new JsonObject(); root.addProperty("type", "forge:add_features"); - root.addProperty("biomes", "#minecraft:is_overworld"); + // Dynamically grab the biome tag + root.addProperty("biomes", "#" + ore.biomeTag().location().toString()); root.addProperty("features", Constants.rl(ore.name() + "_placed").toString()); root.addProperty("step", "underground_ores"); @@ -66,7 +70,8 @@ public class ModWorldgenProvider implements DataProvider { private CompletableFuture saveNeoForgeAddFeatureBiomeModifier(CachedOutput cachedOutput, ModWorldgenDefinitions.OreDefinition ore) { JsonObject root = new JsonObject(); root.addProperty("type", "neoforge:add_features"); - root.addProperty("biomes", "#minecraft:is_overworld"); + // Dynamically grab the biome tag + root.addProperty("biomes", "#" + ore.biomeTag().location().toString()); root.addProperty("features", Constants.rl(ore.name() + "_placed").toString()); root.addProperty("step", "underground_ores"); @@ -192,6 +197,42 @@ public class ModWorldgenProvider implements DataProvider { return DataProvider.saveStable(cachedOutput, root, path); } + private CompletableFuture saveIsSnowyFallbackTag(CachedOutput cachedOutput) { + JsonObject root = new JsonObject(); + root.addProperty("replace", false); + + JsonArray values = new JsonArray(); + + // Optional Forge Tag + JsonObject forgeTag = new JsonObject(); + forgeTag.addProperty("id", "#forge:is_snowy"); + forgeTag.addProperty("required", false); + values.add(forgeTag); + + // Optional Fabric Tag + JsonObject fabricTag = new JsonObject(); + fabricTag.addProperty("id", "#c:snowy"); + fabricTag.addProperty("required", false); + values.add(fabricTag); + + // Vanilla Fallbacks + values.add("minecraft:snowy_plains"); + values.add("minecraft:ice_spikes"); + values.add("minecraft:snowy_taiga"); + values.add("minecraft:snowy_beach"); + values.add("minecraft:grove"); + values.add("minecraft:snowy_slopes"); + values.add("minecraft:jagged_peaks"); + values.add("minecraft:frozen_peaks"); + + root.add("values", values); + + Path path = output.getOutputFolder() + .resolve("data/" + Constants.MOD_ID + "/tags/worldgen/biome/is_snowy.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/client/AlbertosaurusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/AlbertosaurusRenderer.java index a2ce820..ba159fe 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/AlbertosaurusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/AlbertosaurusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class AlbertosaurusRenderer extends GeoEntityRenderer { - private final float animalScale = 1.7F; - public AlbertosaurusRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new AlbertosaurusModel()); - } + public AlbertosaurusRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new AlbertosaurusModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, AlbertosaurusEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, AlbertosaurusEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/AllosaurusModel.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/AllosaurusModel.java index 54ab2fb..99ef85b 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/AllosaurusModel.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/AllosaurusModel.java @@ -25,6 +25,9 @@ public class AllosaurusModel extends GeoModel { map.put(AllosaurusVariant.FEMALE, Constants.rl("textures/entity/allosaurus_female.png")); }); + private static final ResourceLocation AL_LOCATION = + Constants.rl("textures/entity/allosaurus_al.png"); + // Model-local "currently applied" offsets; cleared before each entity render private float[] appliedYaw = null; private float[] appliedRoll = null; @@ -36,7 +39,11 @@ public class AllosaurusModel extends GeoModel { @Override public ResourceLocation getTextureResource(AllosaurusEntity animatable) { - return LOCATION_BY_VARIANT.get(animatable.getVariant()); + if (animatable.hasCustomName() && "al".equalsIgnoreCase(animatable.getName().getString())) { + return AL_LOCATION; + } + + return LOCATION_BY_VARIANT.get(animatable.getVariant()); } @Override diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/AllosaurusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/AllosaurusRenderer.java index 64d4ef8..a6e660c 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/AllosaurusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/AllosaurusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class AllosaurusRenderer extends GeoEntityRenderer { - private final float animalScale = 1.9F; public AllosaurusRenderer(EntityRendererProvider.Context renderManager) { super(renderManager, new AllosaurusModel()); } @Override public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, AllosaurusEntity 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); - } + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/AlvarezsaurusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/AlvarezsaurusRenderer.java index cd35a32..f4c26a6 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/AlvarezsaurusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/AlvarezsaurusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class AlvarezsaurusRenderer extends GeoEntityRenderer { - private final float animalScale = 0.8F; - public AlvarezsaurusRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new AlvarezsaurusModel()); - } + public AlvarezsaurusRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new AlvarezsaurusModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, AlvarezsaurusEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, AlvarezsaurusEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/AnkylosaurusModel.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/AnkylosaurusModel.java index c34302a..261c6db 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/AnkylosaurusModel.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/AnkylosaurusModel.java @@ -25,6 +25,9 @@ public class AnkylosaurusModel extends GeoModel { map.put(AnkylosaurusVariant.FEMALE, Constants.rl("textures/entity/ankylosaurus_female.png")); }); + private static final ResourceLocation BUMPY_LOCATION = + Constants.rl("textures/entity/ankylosaurus_bumpy.png"); + // Model-local "currently applied" offsets; cleared before each entity render private float[] appliedYaw = null; private float[] appliedRoll = null; @@ -34,10 +37,14 @@ public class AnkylosaurusModel extends GeoModel { return Constants.rl("geo/ankylosaurus.geo.json"); } - @Override - public ResourceLocation getTextureResource(AnkylosaurusEntity animatable) { - return LOCATION_BY_VARIANT.get(animatable.getVariant()); - } + @Override + public ResourceLocation getTextureResource(AnkylosaurusEntity animatable) { + if (animatable.hasCustomName() && "bumpy".equalsIgnoreCase(animatable.getName().getString())) { + return BUMPY_LOCATION; + } + + return LOCATION_BY_VARIANT.get(animatable.getVariant()); + } @Override public ResourceLocation getAnimationResource(AnkylosaurusEntity animatable) { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/AnkylosaurusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/AnkylosaurusRenderer.java index bac1d77..0c11aec 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/AnkylosaurusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/AnkylosaurusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class AnkylosaurusRenderer extends GeoEntityRenderer { - private final float animalScale = 2.4F; - public AnkylosaurusRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new AnkylosaurusModel()); - } + public AnkylosaurusRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new AnkylosaurusModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, AnkylosaurusEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, AnkylosaurusEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/ApatosaurusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/ApatosaurusRenderer.java index 0516cd7..dd9f382 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/ApatosaurusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/ApatosaurusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class ApatosaurusRenderer extends GeoEntityRenderer { - private final float animalScale = 1.9F; - public ApatosaurusRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new ApatosaurusModel()); - } + public ApatosaurusRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new ApatosaurusModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, ApatosaurusEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, ApatosaurusEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/ArambourgianiaRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/ArambourgianiaRenderer.java index 79939bb..c64a667 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/ArambourgianiaRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/ArambourgianiaRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class ArambourgianiaRenderer extends GeoEntityRenderer { - private final float animalScale = 1.9F; - public ArambourgianiaRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new ArambourgianiaModel()); - } + public ArambourgianiaRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new ArambourgianiaModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, ArambourgianiaEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, ArambourgianiaEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/BaryonyxRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/BaryonyxRenderer.java index 5c70a01..7ba1a49 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/BaryonyxRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/BaryonyxRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class BaryonyxRenderer extends GeoEntityRenderer { - private final float animalScale = 1.3F; - public BaryonyxRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new BaryonyxModel()); - } + public BaryonyxRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new BaryonyxModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, BaryonyxEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, BaryonyxEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/BrachiosaurusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/BrachiosaurusRenderer.java index 635296c..02b3e52 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/BrachiosaurusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/BrachiosaurusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class BrachiosaurusRenderer extends GeoEntityRenderer { - private final float animalScale = 2.0F; - public BrachiosaurusRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new BrachiosaurusModel()); - } + public BrachiosaurusRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new BrachiosaurusModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, BrachiosaurusEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, BrachiosaurusEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/CarcharodontosaurusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/CarcharodontosaurusRenderer.java index 2450fd3..7a31cae 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/CarcharodontosaurusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/CarcharodontosaurusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class CarcharodontosaurusRenderer extends GeoEntityRenderer { - private final float animalScale = 2.0F; public CarcharodontosaurusRenderer(EntityRendererProvider.Context renderManager) { super(renderManager, new CarcharodontosaurusModel()); } @Override public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, CarcharodontosaurusEntity 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); - } + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/CarnotaurusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/CarnotaurusRenderer.java index 83c730c..7186e2f 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/CarnotaurusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/CarnotaurusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class CarnotaurusRenderer extends GeoEntityRenderer { - private final float animalScale = 1.5F; public CarnotaurusRenderer(EntityRendererProvider.Context renderManager) { super(renderManager, new CarnotaurusModel()); } @Override public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, CarnotaurusEntity 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); - } + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/CearadactylusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/CearadactylusRenderer.java index 1f40e5f..b004bd8 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/CearadactylusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/CearadactylusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class CearadactylusRenderer extends GeoEntityRenderer { - private final float animalScale = 0.9F; - public CearadactylusRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new CearadactylusModel()); - } + public CearadactylusRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new CearadactylusModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, CearadactylusEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, CearadactylusEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/CeratosaurusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/CeratosaurusRenderer.java index 68614a5..e83ec3e 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/CeratosaurusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/CeratosaurusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class CeratosaurusRenderer extends GeoEntityRenderer { - private final float animalScale = 2.1F; - public CeratosaurusRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new CeratosaurusModel()); - } + public CeratosaurusRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new CeratosaurusModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, CeratosaurusEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, CeratosaurusEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/ChasmosaurusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/ChasmosaurusRenderer.java index ab6069b..7f3322c 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/ChasmosaurusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/ChasmosaurusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class ChasmosaurusRenderer extends GeoEntityRenderer { - private final float animalScale = 1.3F; - public ChasmosaurusRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new ChasmosaurusModel()); - } + public ChasmosaurusRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new ChasmosaurusModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, ChasmosaurusEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, ChasmosaurusEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/ChickenosaurusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/ChickenosaurusRenderer.java index 42599b1..245df3e 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/ChickenosaurusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/ChickenosaurusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class ChickenosaurusRenderer extends GeoEntityRenderer { - private final float animalScale = 0.9F; - public ChickenosaurusRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new ChickenosaurusModel()); - } + public ChickenosaurusRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new ChickenosaurusModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, ChickenosaurusEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, ChickenosaurusEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/ChilesaurusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/ChilesaurusRenderer.java index b64de2d..053b1de 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/ChilesaurusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/ChilesaurusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class ChilesaurusRenderer extends GeoEntityRenderer { - private final float animalScale = 0.6F; - public ChilesaurusRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new ChilesaurusModel()); - } + public ChilesaurusRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new ChilesaurusModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, ChilesaurusEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, ChilesaurusEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/CoelophysisRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/CoelophysisRenderer.java index 8458714..6991f71 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/CoelophysisRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/CoelophysisRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class CoelophysisRenderer extends GeoEntityRenderer { - private final float animalScale = 0.7F; - public CoelophysisRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new CoelophysisModel()); - } + public CoelophysisRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new CoelophysisModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, CoelophysisEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, CoelophysisEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/CoelurusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/CoelurusRenderer.java index c84fd88..db36c22 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/CoelurusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/CoelurusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class CoelurusRenderer extends GeoEntityRenderer { - private final float animalScale = 0.5F; - public CoelurusRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new CoelurusModel()); - } + public CoelurusRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new CoelurusModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, CoelurusEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, CoelurusEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/CompsognathusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/CompsognathusRenderer.java index 0c9ccd8..7183115 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/CompsognathusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/CompsognathusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class CompsognathusRenderer extends GeoEntityRenderer { - private final float animalScale = 0.4F; public CompsognathusRenderer(EntityRendererProvider.Context renderManager) { super(renderManager, new CompsognathusModel()); } @Override public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, CompsognathusEntity 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); - } + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/ConcavenatorRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/ConcavenatorRenderer.java index 99b73a8..39c886e 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/ConcavenatorRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/ConcavenatorRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class ConcavenatorRenderer extends GeoEntityRenderer { - private final float animalScale = 0.9F; - public ConcavenatorRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new ConcavenatorModel()); - } + public ConcavenatorRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new ConcavenatorModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, ConcavenatorEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, ConcavenatorEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/CorythosaurusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/CorythosaurusRenderer.java index c6cd69d..d769ff8 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/CorythosaurusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/CorythosaurusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class CorythosaurusRenderer extends GeoEntityRenderer { - private final float animalScale = 1.7F; - public CorythosaurusRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new CorythosaurusModel()); - } + public CorythosaurusRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new CorythosaurusModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, CorythosaurusEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, CorythosaurusEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/DeinonychusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/DeinonychusRenderer.java index 68fe9a5..21463d5 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/DeinonychusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/DeinonychusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class DeinonychusRenderer extends GeoEntityRenderer { - private final float animalScale = 0.9F; - public DeinonychusRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new DeinonychusModel()); - } + public DeinonychusRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new DeinonychusModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, DeinonychusEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, DeinonychusEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/DilophosaurusModel.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/DilophosaurusModel.java index e84a928..6fc2c51 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/DilophosaurusModel.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/DilophosaurusModel.java @@ -25,6 +25,9 @@ public class DilophosaurusModel extends GeoModel { map.put(DilophosaurusVariant.FEMALE, Constants.rl("textures/entity/dilophosaurus_female.png")); }); + private static final ResourceLocation INFERNO_LOCATION = + Constants.rl("textures/entity/dilophosaurus_inferno.png"); + // Model-local "currently applied" offsets; cleared before each entity render private float[] appliedYaw = null; private float[] appliedRoll = null; @@ -36,6 +39,10 @@ public class DilophosaurusModel extends GeoModel { @Override public ResourceLocation getTextureResource(DilophosaurusEntity animatable) { + if (animatable.hasCustomName() && "inferno".equalsIgnoreCase(animatable.getName().getString())) { + return INFERNO_LOCATION; + } + return LOCATION_BY_VARIANT.get(animatable.getVariant()); } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/DilophosaurusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/DilophosaurusRenderer.java index ed6bd97..fc60ba9 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/DilophosaurusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/DilophosaurusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class DilophosaurusRenderer extends GeoEntityRenderer { - private final float animalScale = 1.2F; - public DilophosaurusRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new DilophosaurusModel()); - } + public DilophosaurusRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new DilophosaurusModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, DilophosaurusEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, DilophosaurusEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/DimorphodonRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/DimorphodonRenderer.java index dfa3305..237b4b1 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/DimorphodonRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/DimorphodonRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class DimorphodonRenderer extends GeoEntityRenderer { - private final float animalScale = 0.7F; - public DimorphodonRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new DimorphodonModel()); - } + public DimorphodonRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new DimorphodonModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, DimorphodonEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, DimorphodonEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/DiplodocusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/DiplodocusRenderer.java index 6006d5f..c070d11 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/DiplodocusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/DiplodocusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class DiplodocusRenderer extends GeoEntityRenderer { - private final float animalScale = 2.8F; - public DiplodocusRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new DiplodocusModel()); - } + public DiplodocusRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new DiplodocusModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, DiplodocusEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, DiplodocusEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/DistortusRexRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/DistortusRexRenderer.java index 3f9161b..927c826 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/DistortusRexRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/DistortusRexRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class DistortusRexRenderer extends GeoEntityRenderer { - private final float animalScale = 3.4F; public DistortusRexRenderer(EntityRendererProvider.Context renderManager) { super(renderManager, new DistortusRexModel()); } @Override public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, DistortusRexEntity 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); - } + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/DryosaurusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/DryosaurusRenderer.java index 9216297..e5b090f 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/DryosaurusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/DryosaurusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class DryosaurusRenderer extends GeoEntityRenderer { - private final float animalScale = 0.45F; - public DryosaurusRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new DryosaurusModel()); - } + public DryosaurusRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new DryosaurusModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, DryosaurusEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, DryosaurusEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/EdmontosaurusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/EdmontosaurusRenderer.java index 926c7c5..577c23c 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/EdmontosaurusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/EdmontosaurusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class EdmontosaurusRenderer extends GeoEntityRenderer { - private final float animalScale = 1.8F; - public EdmontosaurusRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new EdmontosaurusModel()); - } + public EdmontosaurusRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new EdmontosaurusModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, EdmontosaurusEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, EdmontosaurusEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/FDuckRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/FDuckRenderer.java index b60b857..e856f1d 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/FDuckRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/FDuckRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class FDuckRenderer extends GeoEntityRenderer { - private final float animalScale = 1.4F; - public FDuckRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new FDuckModel()); - } + public FDuckRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new FDuckModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, FDuckEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, FDuckEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/GallimimusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/GallimimusRenderer.java index 341f7e9..bbcfb27 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/GallimimusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/GallimimusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class GallimimusRenderer extends GeoEntityRenderer { - private final float animalScale = 1.0F; - public GallimimusRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new GallimimusModel()); - } + public GallimimusRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new GallimimusModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, GallimimusEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, GallimimusEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/GeosternbergiaRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/GeosternbergiaRenderer.java index 1d4a250..3f8700b 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/GeosternbergiaRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/GeosternbergiaRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class GeosternbergiaRenderer extends GeoEntityRenderer { - private final float animalScale = 1.4F; - public GeosternbergiaRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new GeosternbergiaModel()); - } + public GeosternbergiaRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new GeosternbergiaModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, GeosternbergiaEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, GeosternbergiaEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/GiganotosaurusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/GiganotosaurusRenderer.java index 23e5601..11e4f24 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/GiganotosaurusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/GiganotosaurusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class GiganotosaurusRenderer extends GeoEntityRenderer { - private final float animalScale = 2.2F; public GiganotosaurusRenderer(EntityRendererProvider.Context renderManager) { super(renderManager, new GiganotosaurusModel()); } @Override public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, GiganotosaurusEntity 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); - } + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/GuanlongRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/GuanlongRenderer.java index 9cecb7b..2b75b65 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/GuanlongRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/GuanlongRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class GuanlongRenderer extends GeoEntityRenderer { - private final float animalScale = 0.6F; - public GuanlongRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new GuanlongModel()); - } + public GuanlongRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new GuanlongModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, GuanlongEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, GuanlongEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/GuidracoRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/GuidracoRenderer.java index 317e892..df83cbd 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/GuidracoRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/GuidracoRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class GuidracoRenderer extends GeoEntityRenderer { - private final float animalScale = 0.8F; - public GuidracoRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new GuidracoModel()); - } + public GuidracoRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new GuidracoModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, GuidracoEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, GuidracoEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/HadrosaurusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/HadrosaurusRenderer.java index 580abcd..f636457 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/HadrosaurusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/HadrosaurusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class HadrosaurusRenderer extends GeoEntityRenderer { - private final float animalScale = 1.5F; - public HadrosaurusRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new HadrosaurusModel()); - } + public HadrosaurusRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new HadrosaurusModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, HadrosaurusEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, HadrosaurusEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/HerrerasaurusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/HerrerasaurusRenderer.java index 7ec746c..0424349 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/HerrerasaurusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/HerrerasaurusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class HerrerasaurusRenderer extends GeoEntityRenderer { - private final float animalScale = 1.3F; - public HerrerasaurusRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new HerrerasaurusModel()); - } + public HerrerasaurusRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new HerrerasaurusModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, HerrerasaurusEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, HerrerasaurusEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/HypsilophodonRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/HypsilophodonRenderer.java index 45e0d5a..277cad1 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/HypsilophodonRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/HypsilophodonRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class HypsilophodonRenderer extends GeoEntityRenderer { - private final float animalScale = 0.5F; - public HypsilophodonRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new HypsilophodonModel()); - } + public HypsilophodonRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new HypsilophodonModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, HypsilophodonEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, HypsilophodonEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/IndominusRexRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/IndominusRexRenderer.java index 0b4f3db..9f466d6 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/IndominusRexRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/IndominusRexRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class IndominusRexRenderer extends GeoEntityRenderer { - private final float animalScale = 3.0F; - public IndominusRexRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new IndominusRexModel()); - } + public IndominusRexRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new IndominusRexModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, IndominusRexEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, IndominusRexEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/IndoraptorRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/IndoraptorRenderer.java index 92aeaa5..547936c 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/IndoraptorRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/IndoraptorRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class IndoraptorRenderer extends GeoEntityRenderer { - private final float animalScale = 1.8F; - public IndoraptorRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new IndoraptorModel()); - } + public IndoraptorRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new IndoraptorModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, IndoraptorEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, IndoraptorEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/InostranceviaRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/InostranceviaRenderer.java index 6b24848..08326d4 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/InostranceviaRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/InostranceviaRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class InostranceviaRenderer extends GeoEntityRenderer { - private final float animalScale = 1.1F; - public InostranceviaRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new InostranceviaModel()); - } + public InostranceviaRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new InostranceviaModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, InostranceviaEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, InostranceviaEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/LambeosaurusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/LambeosaurusRenderer.java index d69b200..f0ea410 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/LambeosaurusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/LambeosaurusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class LambeosaurusRenderer extends GeoEntityRenderer { - private final float animalScale = 1.8F; - public LambeosaurusRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new LambeosaurusModel()); - } + public LambeosaurusRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new LambeosaurusModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, LambeosaurusEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, LambeosaurusEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/LudodactylusModel.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/LudodactylusModel.java index 5a29272..2d5796a 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/LudodactylusModel.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/LudodactylusModel.java @@ -25,6 +25,9 @@ public class LudodactylusModel extends GeoModel { map.put(LudodactylusVariant.FEMALE, Constants.rl("textures/entity/ludodactylus_female.png")); }); + private static final ResourceLocation PINWIN_LOCATION = + Constants.rl("textures/entity/ludodactylus_pinwin.png"); + // Model-local "currently applied" offsets; cleared before each entity render private float[] appliedYaw = null; private float[] appliedRoll = null; @@ -36,6 +39,10 @@ public class LudodactylusModel extends GeoModel { @Override public ResourceLocation getTextureResource(LudodactylusEntity animatable) { + if (animatable.hasCustomName() && "pinwin".equalsIgnoreCase(animatable.getName().getString())) { + return PINWIN_LOCATION; + } + return LOCATION_BY_VARIANT.get(animatable.getVariant()); } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/LudodactylusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/LudodactylusRenderer.java index d024549..3f6a82b 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/LudodactylusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/LudodactylusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class LudodactylusRenderer extends GeoEntityRenderer { - private final float animalScale = 1.5F; - public LudodactylusRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new LudodactylusModel()); - } + public LudodactylusRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new LudodactylusModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, LudodactylusEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, LudodactylusEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/MajungasaurusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/MajungasaurusRenderer.java index 6ee34f7..83deb3f 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/MajungasaurusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/MajungasaurusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class MajungasaurusRenderer extends GeoEntityRenderer { - private final float animalScale = 1.4F; - public MajungasaurusRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new MajungasaurusModel()); - } + public MajungasaurusRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new MajungasaurusModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, MajungasaurusEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, MajungasaurusEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/MamenchisaurusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/MamenchisaurusRenderer.java index 1a15817..4fd5f8f 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/MamenchisaurusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/MamenchisaurusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class MamenchisaurusRenderer extends GeoEntityRenderer { - private final float animalScale = 1.7F; - public MamenchisaurusRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new MamenchisaurusModel()); - } + public MamenchisaurusRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new MamenchisaurusModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, MamenchisaurusEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, MamenchisaurusEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/MetriacanthosaurusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/MetriacanthosaurusRenderer.java index a5a3926..747f061 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/MetriacanthosaurusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/MetriacanthosaurusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class MetriacanthosaurusRenderer extends GeoEntityRenderer { - private final float animalScale = 1.5F; public MetriacanthosaurusRenderer(EntityRendererProvider.Context renderManager) { super(renderManager, new MetriacanthosaurusModel()); } @Override public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, MetriacanthosaurusEntity 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); - } + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/MoganopterusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/MoganopterusRenderer.java index 95d79c8..39eb47b 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/MoganopterusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/MoganopterusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class MoganopterusRenderer extends GeoEntityRenderer { - private final float animalScale = 0.8F; public MoganopterusRenderer(EntityRendererProvider.Context renderManager) { super(renderManager, new MoganopterusModel()); } @Override public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, MoganopterusEntity 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); - } + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/MussasaurusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/MussasaurusRenderer.java index 77f40f1..fc595b0 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/MussasaurusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/MussasaurusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class MussasaurusRenderer extends GeoEntityRenderer { - private final float animalScale = 0.7F; public MussasaurusRenderer(EntityRendererProvider.Context renderManager) { super(renderManager, new MussasaurusModel()); } @Override public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, MussasaurusEntity 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); - } + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/NyctosaurusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/NyctosaurusRenderer.java index db81d30..3c4704d 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/NyctosaurusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/NyctosaurusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class NyctosaurusRenderer extends GeoEntityRenderer { - private final float animalScale = 0.3F; public NyctosaurusRenderer(EntityRendererProvider.Context renderManager) { super(renderManager, new NyctosaurusModel()); } @Override public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, NyctosaurusEntity 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); - } + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/OrnitholestesRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/OrnitholestesRenderer.java index 1a84e1e..5cb6116 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/OrnitholestesRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/OrnitholestesRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class OrnitholestesRenderer extends GeoEntityRenderer { - private final float animalScale = 0.6F; - public OrnitholestesRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new OrnitholestesModel()); - } + public OrnitholestesRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new OrnitholestesModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, OrnitholestesEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, OrnitholestesEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/OrnithomimusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/OrnithomimusRenderer.java index 1a16fa1..168fb14 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/OrnithomimusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/OrnithomimusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class OrnithomimusRenderer extends GeoEntityRenderer { - private final float animalScale = 0.8F; public OrnithomimusRenderer(EntityRendererProvider.Context renderManager) { super(renderManager, new OrnithomimusModel()); } @Override public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, OrnithomimusEntity 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); - } + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/OuranosaurusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/OuranosaurusRenderer.java index eef76b8..5890dd2 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/OuranosaurusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/OuranosaurusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class OuranosaurusRenderer extends GeoEntityRenderer { - private final float animalScale = 1.2F; public OuranosaurusRenderer(EntityRendererProvider.Context renderManager) { super(renderManager, new OuranosaurusModel()); } @Override public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, OuranosaurusEntity 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); - } + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/OviraptorRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/OviraptorRenderer.java index 80f6e38..cdf51af 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/OviraptorRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/OviraptorRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class OviraptorRenderer extends GeoEntityRenderer { - private final float animalScale = 0.55F; - public OviraptorRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new OviraptorModel()); - } + public OviraptorRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new OviraptorModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, OviraptorEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, OviraptorEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/PachycephalosaurusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/PachycephalosaurusRenderer.java index 8f683d9..5c820c1 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/PachycephalosaurusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/PachycephalosaurusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class PachycephalosaurusRenderer extends GeoEntityRenderer { - private final float animalScale = 0.8F; - public PachycephalosaurusRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new PachycephalosaurusModel()); - } + public PachycephalosaurusRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new PachycephalosaurusModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, PachycephalosaurusEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, PachycephalosaurusEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/ParasaurolophusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/ParasaurolophusRenderer.java index 1e67593..dc3aa20 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/ParasaurolophusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/ParasaurolophusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class ParasaurolophusRenderer extends GeoEntityRenderer { - private final float animalScale = 1.7F; - public ParasaurolophusRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new ParasaurolophusModel()); - } + public ParasaurolophusRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new ParasaurolophusModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, ParasaurolophusEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, ParasaurolophusEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/ProceratosaurusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/ProceratosaurusRenderer.java index 41f34cb..fc80d6a 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/ProceratosaurusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/ProceratosaurusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class ProceratosaurusRenderer extends GeoEntityRenderer { - private final float animalScale = 0.6F; - public ProceratosaurusRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new ProceratosaurusModel()); - } + public ProceratosaurusRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new ProceratosaurusModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, ProceratosaurusEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, ProceratosaurusEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/ProcompsognathusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/ProcompsognathusRenderer.java index 6e949d3..2552ead 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/ProcompsognathusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/ProcompsognathusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class ProcompsognathusRenderer extends GeoEntityRenderer { - private final float animalScale = 0.2F; public ProcompsognathusRenderer(EntityRendererProvider.Context renderManager) { super(renderManager, new ProcompsognathusModel()); } @Override public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, ProcompsognathusEntity 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); - } + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/ProtoceratopsRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/ProtoceratopsRenderer.java index 58c70e6..2f20c61 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/ProtoceratopsRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/ProtoceratopsRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class ProtoceratopsRenderer extends GeoEntityRenderer { - private final float animalScale = 1.2F; - public ProtoceratopsRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new ProtoceratopsModel()); - } + public ProtoceratopsRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new ProtoceratopsModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, ProtoceratopsEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, ProtoceratopsEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/PteranodonRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/PteranodonRenderer.java index e482136..7b668ce 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/PteranodonRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/PteranodonRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class PteranodonRenderer extends GeoEntityRenderer { - private final float animalScale = 1.5F; - public PteranodonRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new PteranodonModel()); - } + public PteranodonRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new PteranodonModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, PteranodonEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, PteranodonEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/PterodaustroRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/PterodaustroRenderer.java index b7048ec..503b511 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/PterodaustroRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/PterodaustroRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class PterodaustroRenderer extends GeoEntityRenderer { - private final float animalScale = 0.7F; - public PterodaustroRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new PterodaustroModel()); - } + public PterodaustroRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new PterodaustroModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, PterodaustroEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, PterodaustroEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/QuetzalcoatlusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/QuetzalcoatlusRenderer.java index d4f3b37..b368c16 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/QuetzalcoatlusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/QuetzalcoatlusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class QuetzalcoatlusRenderer extends GeoEntityRenderer { - private final float animalScale = 2.0F; public QuetzalcoatlusRenderer(EntityRendererProvider.Context renderManager) { super(renderManager, new QuetzalcoatlusModel()); } @Override public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, QuetzalcoatlusEntity 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); - } + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/RajasaurusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/RajasaurusRenderer.java index 8c08a95..9d90916 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/RajasaurusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/RajasaurusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class RajasaurusRenderer extends GeoEntityRenderer { - private final float animalScale = 1.5F; public RajasaurusRenderer(EntityRendererProvider.Context renderManager) { super(renderManager, new RajasaurusModel()); } @Override public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, RajasaurusEntity 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); - } + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/RugopsRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/RugopsRenderer.java index cc92bb7..fb74c29 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/RugopsRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/RugopsRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class RugopsRenderer extends GeoEntityRenderer { - private final float animalScale = 0.9F; public RugopsRenderer(EntityRendererProvider.Context renderManager) { super(renderManager, new RugopsModel()); } @Override public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, RugopsEntity 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); - } + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/SegisaurusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/SegisaurusRenderer.java index 9515d15..d501b5a 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/SegisaurusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/SegisaurusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class SegisaurusRenderer extends GeoEntityRenderer { - private final float animalScale = 0.62F; public SegisaurusRenderer(EntityRendererProvider.Context renderManager) { super(renderManager, new SegisaurusModel()); } @Override public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, SegisaurusEntity 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); - } + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/ShantungosaurusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/ShantungosaurusRenderer.java index b17f2cb..8bf54b2 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/ShantungosaurusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/ShantungosaurusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class ShantungosaurusRenderer extends GeoEntityRenderer { - private final float animalScale = 1.8F; public ShantungosaurusRenderer(EntityRendererProvider.Context renderManager) { super(renderManager, new ShantungosaurusModel()); } @Override public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, ShantungosaurusEntity 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); - } + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/SpinosaurusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/SpinosaurusRenderer.java index 1dd7013..c2b0f0b 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/SpinosaurusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/SpinosaurusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class SpinosaurusRenderer extends GeoEntityRenderer { - private final float animalScale = 2.2F; public SpinosaurusRenderer(EntityRendererProvider.Context renderManager) { super(renderManager, new SpinosaurusModel()); } @Override public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, SpinosaurusEntity 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); - } + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/StegosaurusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/StegosaurusRenderer.java index 56f28a4..e1cc2e0 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/StegosaurusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/StegosaurusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class StegosaurusRenderer extends GeoEntityRenderer { - private final float animalScale = 1.8F; - public StegosaurusRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new StegosaurusModel()); - } + public StegosaurusRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new StegosaurusModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, StegosaurusEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, StegosaurusEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/StyracosaurusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/StyracosaurusRenderer.java index ff0cf36..903dfbb 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/StyracosaurusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/StyracosaurusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class StyracosaurusRenderer extends GeoEntityRenderer { - private final float animalScale = 0.7F; - public StyracosaurusRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new StyracosaurusModel()); - } + public StyracosaurusRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new StyracosaurusModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, StyracosaurusEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, StyracosaurusEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/SuchomimusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/SuchomimusRenderer.java index 935985b..9c6a4e8 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/SuchomimusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/SuchomimusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class SuchomimusRenderer extends GeoEntityRenderer { - private final float animalScale = 1.5F; public SuchomimusRenderer(EntityRendererProvider.Context renderManager) { super(renderManager, new SuchomimusModel()); } @Override public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, SuchomimusEntity 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); - } + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/TapejaraRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/TapejaraRenderer.java index b86b50b..97f9943 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/TapejaraRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/TapejaraRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class TapejaraRenderer extends GeoEntityRenderer { - private final float animalScale = 0.6F; - public TapejaraRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new TapejaraModel()); - } + public TapejaraRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new TapejaraModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, TapejaraEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, TapejaraEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/TherizinosaurusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/TherizinosaurusRenderer.java index bbca7f9..85424b6 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/TherizinosaurusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/TherizinosaurusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class TherizinosaurusRenderer extends GeoEntityRenderer { - private final float animalScale = 1.9F; - public TherizinosaurusRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new TherizinosaurusModel()); - } + public TherizinosaurusRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new TherizinosaurusModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, TherizinosaurusEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, TherizinosaurusEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/ThescelosaurusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/ThescelosaurusRenderer.java index 032f631..41f7fe7 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/ThescelosaurusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/ThescelosaurusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class ThescelosaurusRenderer extends GeoEntityRenderer { - private final float animalScale = 0.7F; public ThescelosaurusRenderer(EntityRendererProvider.Context renderManager) { super(renderManager, new ThescelosaurusModel()); } @Override public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, ThescelosaurusEntity 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); - } + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/TitanosaurusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/TitanosaurusRenderer.java index 1495129..3e7fa0b 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/TitanosaurusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/TitanosaurusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class TitanosaurusRenderer extends GeoEntityRenderer { - private final float animalScale = 2.3F; public TitanosaurusRenderer(EntityRendererProvider.Context renderManager) { super(renderManager, new TitanosaurusModel()); } @Override public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, TitanosaurusEntity 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); - } - } + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/TriceratopsRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/TriceratopsRenderer.java index f589f07..0e99753 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/TriceratopsRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/TriceratopsRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class TriceratopsRenderer extends GeoEntityRenderer { - private final float animalScale = 1.5F; - public TriceratopsRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new TriceratopsModel()); - } + public TriceratopsRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new TriceratopsModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, TriceratopsEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, TriceratopsEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/TroodonRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/TroodonRenderer.java index 3d09201..7ceca2c 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/TroodonRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/TroodonRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class TroodonRenderer extends GeoEntityRenderer { - private final float animalScale = 0.3F; public TroodonRenderer(EntityRendererProvider.Context renderManager) { super(renderManager, new TroodonModel()); } @Override public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, TroodonEntity 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); - } + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/TropeognathusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/TropeognathusRenderer.java index f2c1c5e..ea02419 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/TropeognathusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/TropeognathusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class TropeognathusRenderer extends GeoEntityRenderer { - private final float animalScale = 1.4F; - public TropeognathusRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new TropeognathusModel()); - } + public TropeognathusRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new TropeognathusModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, TropeognathusEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, TropeognathusEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/TupuxuaraRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/TupuxuaraRenderer.java index 1e31bda..d0fec54 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/TupuxuaraRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/TupuxuaraRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class TupuxuaraRenderer extends GeoEntityRenderer { - private final float animalScale = 1.0F; public TupuxuaraRenderer(EntityRendererProvider.Context renderManager) { super(renderManager, new TupuxuaraModel()); } @Override public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, TupuxuaraEntity 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); - } + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/TyrannosaurusRexModel.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/TyrannosaurusRexModel.java index 6fdca42..54f9ed8 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/TyrannosaurusRexModel.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/TyrannosaurusRexModel.java @@ -25,6 +25,12 @@ public class TyrannosaurusRexModel extends GeoModel { map.put(TyrannosaurusRexVariant.FEMALE, Constants.rl("textures/entity/tyrannosaurus_rex_female.png")); }); + private static final ResourceLocation DRGRAY_LOCATION = + Constants.rl("textures/entity/tyrannosaurus_rex_drgray.png"); + + private static final ResourceLocation EMBER_LOCATION = + Constants.rl("textures/entity/tyrannosaurus_rex_ember.png"); + // Model-local "currently applied" offsets; cleared before each entity render private float[] appliedYaw = null; private float[] appliedRoll = null; @@ -36,7 +42,15 @@ public class TyrannosaurusRexModel extends GeoModel { @Override public ResourceLocation getTextureResource(TyrannosaurusRexEntity animatable) { - return LOCATION_BY_VARIANT.get(animatable.getVariant()); + if (animatable.hasCustomName() && "drgray".equalsIgnoreCase(animatable.getName().getString())) { + return DRGRAY_LOCATION; + } + + if (animatable.hasCustomName() && "ember".equalsIgnoreCase(animatable.getName().getString())) { + return EMBER_LOCATION; + } + + return LOCATION_BY_VARIANT.get(animatable.getVariant()); } @Override diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/TyrannosaurusRexRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/TyrannosaurusRexRenderer.java index 57041aa..c3d2765 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/TyrannosaurusRexRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/TyrannosaurusRexRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class TyrannosaurusRexRenderer extends GeoEntityRenderer { - private final float animalScale = 2.5F; public TyrannosaurusRexRenderer(EntityRendererProvider.Context renderManager) { super(renderManager, new TyrannosaurusRexModel()); } @Override public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, TyrannosaurusRexEntity 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); - } + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/UtahraptorRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/UtahraptorRenderer.java index 530242d..efc4063 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/UtahraptorRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/UtahraptorRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class UtahraptorRenderer extends GeoEntityRenderer { - private final float animalScale = 1.0F; - public UtahraptorRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new UtahraptorModel()); - } + public UtahraptorRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new UtahraptorModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, UtahraptorEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, UtahraptorEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/VelociraptorModel.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/VelociraptorModel.java index 16d8559..d14cf79 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/VelociraptorModel.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/VelociraptorModel.java @@ -25,6 +25,18 @@ public class VelociraptorModel extends GeoModel { map.put(VelociraptorVariant.FEMALE, Constants.rl("textures/entity/velociraptor_female.png")); }); + private static final ResourceLocation BLUE_LOCATION = + Constants.rl("textures/entity/velociraptor_blue.png"); + + private static final ResourceLocation CHARLIE_LOCATION = + Constants.rl("textures/entity/velociraptor_charlie.png"); + + private static final ResourceLocation DELTA_LOCATION = + Constants.rl("textures/entity/velociraptor_delta.png"); + + private static final ResourceLocation ECHO_LOCATION = + Constants.rl("textures/entity/velociraptor_echo.png"); + // Model-local "currently applied" offsets; cleared before each entity render private float[] appliedYaw = null; private float[] appliedRoll = null; @@ -36,6 +48,19 @@ public class VelociraptorModel extends GeoModel { @Override public ResourceLocation getTextureResource(VelociraptorEntity animatable) { + if (animatable.hasCustomName() && "blue".equalsIgnoreCase(animatable.getName().getString())) { + return BLUE_LOCATION; + } + if (animatable.hasCustomName() && "charlie".equalsIgnoreCase(animatable.getName().getString())) { + return CHARLIE_LOCATION; + } + if (animatable.hasCustomName() && "delta".equalsIgnoreCase(animatable.getName().getString())) { + return DELTA_LOCATION; + } + if (animatable.hasCustomName() && "echo".equalsIgnoreCase(animatable.getName().getString())) { + return ECHO_LOCATION; + } + return LOCATION_BY_VARIANT.get(animatable.getVariant()); } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/VelociraptorRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/VelociraptorRenderer.java index 06216da..36ee698 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/VelociraptorRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/VelociraptorRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class VelociraptorRenderer extends GeoEntityRenderer { - private final float animalScale = 1.0F; - public VelociraptorRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager, new VelociraptorModel()); - } + public VelociraptorRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new VelociraptorModel()); + } - @Override - public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, VelociraptorEntity 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); - } - } + @Override + public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, VelociraptorEntity animatable, BakedGeoModel model, boolean isReRender, float partialTick, int packedLight, int packedOverlay) { + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); + } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/client/ZhenyuanopterusRenderer.java b/common/src/main/java/net/cmr/jurassicrevived/entity/client/ZhenyuanopterusRenderer.java index bb12bbf..2a54a88 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/client/ZhenyuanopterusRenderer.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/client/ZhenyuanopterusRenderer.java @@ -9,18 +9,13 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class ZhenyuanopterusRenderer extends GeoEntityRenderer { - private final float animalScale = 1.1F; public ZhenyuanopterusRenderer(EntityRendererProvider.Context renderManager) { super(renderManager, new ZhenyuanopterusModel()); } @Override public void scaleModelForRender(float widthScale, float heightScale, PoseStack poseStack, ZhenyuanopterusEntity 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); - } + float scale = animatable.getTotalModelScale(); + poseStack.scale(scale, scale, scale); } } diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/AchillobatorEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/AchillobatorEntity.java index 8fd1706..e98dca8 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/AchillobatorEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/AchillobatorEntity.java @@ -46,9 +46,9 @@ import software.bernie.geckolib.animation.*; public class AchillobatorEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - public static final int BABY_TO_ADULT_AGE_TICKS = 240; - private static final float MIN_ANIMAL_SCALE = 0.92F; - private static final float MAX_ANIMAL_SCALE = 1.08F; + public static final int BABY_TO_ADULT_AGE_TICKS = 28800; + private static final float MIN_ANIMAL_SCALE = 0.8F; + private static final float MAX_ANIMAL_SCALE = 1.2F; private float lastDimensionsScale = 1.0F; diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/AlbertosaurusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/AlbertosaurusEntity.java index f5c6eaa..62d6ad5 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/AlbertosaurusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/AlbertosaurusEntity.java @@ -47,10 +47,18 @@ import software.bernie.geckolib.animation.*; public class AlbertosaurusEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); + public static final int BABY_TO_ADULT_AGE_TICKS = 67200; + private static final float MIN_ANIMAL_SCALE = 1.5F; + private static final float MAX_ANIMAL_SCALE = 1.9F; + + private float lastDimensionsScale = 1.0F; + private static final EntityDataAccessor VARIANT = SynchedEntityData.defineId(AlbertosaurusEntity.class, EntityDataSerializers.INT); private static final EntityDataAccessor DATA_SYNCED_AGE = SynchedEntityData.defineId(AlbertosaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(AlbertosaurusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -103,6 +111,10 @@ public class AlbertosaurusEntity extends DinoEntityBase implements GeoEntity { return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); } + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } + public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() .add(Attributes.MAX_HEALTH, 55D) @@ -121,6 +133,7 @@ public class AlbertosaurusEntity extends DinoEntityBase implements GeoEntity { if (child instanceof AlbertosaurusEntity baby) { AlbertosaurusVariant randomVariant = Util.getRandom(AlbertosaurusVariant.values(), this.random); baby.setVariant(randomVariant); + baby.setBaby(true); } return child; } @@ -179,6 +192,8 @@ public class AlbertosaurusEntity extends DinoEntityBase implements GeoEntity { } } + updateDynamicDimensions(); + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; @@ -244,6 +259,7 @@ public class AlbertosaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -251,6 +267,7 @@ public class AlbertosaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ @@ -258,6 +275,48 @@ public class AlbertosaurusEntity extends DinoEntityBase implements GeoEntity { return this.entityData.get(DATA_SYNCED_AGE); } + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ + public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -280,12 +339,16 @@ public class AlbertosaurusEntity extends DinoEntityBase implements GeoEntity { public void addAdditionalSaveData(CompoundTag pCompound) { super.addAdditionalSaveData(pCompound); pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); } @Override public void readAdditionalSaveData(CompoundTag pCompound) { super.readAdditionalSaveData(pCompound); this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } } /*? if <=1.20.1 {*/ @@ -293,15 +356,13 @@ public class AlbertosaurusEntity extends DinoEntityBase implements GeoEntity { public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { AlbertosaurusVariant variant = Util.getRandom(AlbertosaurusVariant.values(), this.random); this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); } /*?} else {*/ /*@Override public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { - AlbertosaurusVariant variant = Util.getRandom(AlbertosaurusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } + AlbertosaurusVariant variant = Util.getRandom(AlbertosaurusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} *//*?}*/ @Override diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/AllosaurusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/AllosaurusEntity.java index 9cab7ee..ca60d34 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/AllosaurusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/AllosaurusEntity.java @@ -50,10 +50,18 @@ import software.bernie.geckolib.animation.*; public class AllosaurusEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(AllosaurusEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(AllosaurusEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 52800; + private static final float MIN_ANIMAL_SCALE = 1.7F; + private static final float MAX_ANIMAL_SCALE = 2.1F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(AllosaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(AllosaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(AllosaurusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -106,6 +114,10 @@ public class AllosaurusEntity extends DinoEntityBase implements GeoEntity { return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); } + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } + public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() .add(Attributes.MAX_HEALTH, 65D) @@ -117,16 +129,17 @@ public class AllosaurusEntity extends DinoEntityBase implements GeoEntity { .add(Attributes.ATTACK_DAMAGE, 18D); } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.ALLOSAURUS.get().create(pLevel); - if (child instanceof AllosaurusEntity baby) { - AllosaurusVariant randomVariant = Util.getRandom(AllosaurusVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.ALLOSAURUS.get().create(pLevel); + if (child instanceof AllosaurusEntity baby) { + AllosaurusVariant randomVariant = Util.getRandom(AllosaurusVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -178,11 +191,13 @@ public class AllosaurusEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -247,6 +262,7 @@ public class AllosaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -254,12 +270,55 @@ public class AllosaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -278,33 +337,35 @@ public class AllosaurusEntity extends DinoEntityBase implements GeoEntity { if (!(other instanceof AllosaurusEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - /*? if <=1.20.1 {*/ - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { - AllosaurusVariant variant = Util.getRandom(AllosaurusVariant.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) { - AllosaurusVariant variant = Util.getRandom(AllosaurusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } - *//*?}*/ + /*? if <=1.20.1 {*/ + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + AllosaurusVariant variant = Util.getRandom(AllosaurusVariant.values(), this.random); + this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); + return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); + } + /*?} else {*/ + /*@Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + AllosaurusVariant variant = Util.getRandom(AllosaurusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} + *//*?}*/ @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/AlvarezsaurusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/AlvarezsaurusEntity.java index 2b109cc..b45517d 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/AlvarezsaurusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/AlvarezsaurusEntity.java @@ -54,10 +54,18 @@ import software.bernie.geckolib.animation.*; public class AlvarezsaurusEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(AlvarezsaurusEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(AlvarezsaurusEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 19200; + private static final float MIN_ANIMAL_SCALE = 0.6F; + private static final float MAX_ANIMAL_SCALE = 1.0F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(AlvarezsaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(AlvarezsaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(AlvarezsaurusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -106,10 +114,14 @@ public class AlvarezsaurusEntity extends DinoEntityBase implements GeoEntity { return ModBlocks.INCUBATED_ALVAREZSAURUS_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -123,16 +135,17 @@ public class AlvarezsaurusEntity extends DinoEntityBase implements GeoEntity { } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.ALVAREZSAURUS.get().create(pLevel); - if (child instanceof AlvarezsaurusEntity baby) { - AlvarezsaurusVariant randomVariant = Util.getRandom(AlvarezsaurusVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.ALVAREZSAURUS.get().create(pLevel); + if (child instanceof AlvarezsaurusEntity baby) { + AlvarezsaurusVariant randomVariant = Util.getRandom(AlvarezsaurusVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -182,11 +195,13 @@ public class AlvarezsaurusEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -251,6 +266,7 @@ public class AlvarezsaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -258,12 +274,55 @@ public class AlvarezsaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -282,33 +341,35 @@ public class AlvarezsaurusEntity extends DinoEntityBase implements GeoEntity { if (!(other instanceof AlvarezsaurusEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - /*? if <=1.20.1 {*/ - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { - AlvarezsaurusVariant variant = Util.getRandom(AlvarezsaurusVariant.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) { - AlvarezsaurusVariant variant = Util.getRandom(AlvarezsaurusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } - *//*?}*/ + /*? if <=1.20.1 {*/ + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + AlvarezsaurusVariant variant = Util.getRandom(AlvarezsaurusVariant.values(), this.random); + this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); + return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); + } + /*?} else {*/ + /*@Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + AlvarezsaurusVariant variant = Util.getRandom(AlvarezsaurusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} + *//*?}*/ @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/AnkylosaurusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/AnkylosaurusEntity.java index 6159dcd..6963e2e 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/AnkylosaurusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/AnkylosaurusEntity.java @@ -53,10 +53,18 @@ import software.bernie.geckolib.animation.*; public class AnkylosaurusEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(AnkylosaurusEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(AnkylosaurusEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 86400; + private static final float MIN_ANIMAL_SCALE = 2.2F; + private static final float MAX_ANIMAL_SCALE = 2.6F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(AnkylosaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(AnkylosaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(AnkylosaurusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -105,10 +113,14 @@ public class AnkylosaurusEntity extends DinoEntityBase implements GeoEntity { return ModBlocks.INCUBATED_ANKYLOSAURUS_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -122,16 +134,17 @@ public class AnkylosaurusEntity extends DinoEntityBase implements GeoEntity { } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.ANKYLOSAURUS.get().create(pLevel); - if (child instanceof AnkylosaurusEntity baby) { - AnkylosaurusVariant randomVariant = Util.getRandom(AnkylosaurusVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.ANKYLOSAURUS.get().create(pLevel); + if (child instanceof AnkylosaurusEntity baby) { + AnkylosaurusVariant randomVariant = Util.getRandom(AnkylosaurusVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -181,11 +194,13 @@ public class AnkylosaurusEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -250,6 +265,7 @@ public class AnkylosaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -257,12 +273,55 @@ public class AnkylosaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -281,33 +340,35 @@ public class AnkylosaurusEntity extends DinoEntityBase implements GeoEntity { if (!(other instanceof AnkylosaurusEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - /*? if <=1.20.1 {*/ - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { - AnkylosaurusVariant variant = Util.getRandom(AnkylosaurusVariant.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) { - AnkylosaurusVariant variant = Util.getRandom(AnkylosaurusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } - *//*?}*/ + /*? if <=1.20.1 {*/ + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + AnkylosaurusVariant variant = Util.getRandom(AnkylosaurusVariant.values(), this.random); + this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); + return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); + } + /*?} else {*/ + /*@Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + AnkylosaurusVariant variant = Util.getRandom(AnkylosaurusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} + *//*?}*/ @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ApatosaurusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ApatosaurusEntity.java index 31101b3..4d8a7d7 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ApatosaurusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ApatosaurusEntity.java @@ -55,10 +55,18 @@ import software.bernie.geckolib.animation.*; public class ApatosaurusEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(ApatosaurusEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(ApatosaurusEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 110400; + private static final float MIN_ANIMAL_SCALE = 1.7F; + private static final float MAX_ANIMAL_SCALE = 2.1F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(ApatosaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(ApatosaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(ApatosaurusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -107,10 +115,14 @@ public class ApatosaurusEntity extends DinoEntityBase implements GeoEntity { return ModBlocks.INCUBATED_APATOSAURUS_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -124,16 +136,17 @@ public class ApatosaurusEntity extends DinoEntityBase implements GeoEntity { } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.APATOSAURUS.get().create(pLevel); - if (child instanceof ApatosaurusEntity baby) { - ApatosaurusVariant randomVariant = Util.getRandom(ApatosaurusVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.APATOSAURUS.get().create(pLevel); + if (child instanceof ApatosaurusEntity baby) { + ApatosaurusVariant randomVariant = Util.getRandom(ApatosaurusVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -185,11 +198,13 @@ public class ApatosaurusEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -254,6 +269,7 @@ public class ApatosaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -261,12 +277,55 @@ public class ApatosaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -285,33 +344,35 @@ public class ApatosaurusEntity extends DinoEntityBase implements GeoEntity { if (!(other instanceof ApatosaurusEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - /*? if <=1.20.1 {*/ - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { - ApatosaurusVariant variant = Util.getRandom(ApatosaurusVariant.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) { - ApatosaurusVariant variant = Util.getRandom(ApatosaurusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } - *//*?}*/ + /*? if <=1.20.1 {*/ + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + ApatosaurusVariant variant = Util.getRandom(ApatosaurusVariant.values(), this.random); + this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); + return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); + } + /*?} else {*/ + /*@Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + ApatosaurusVariant variant = Util.getRandom(ApatosaurusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} + *//*?}*/ @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ArambourgianiaEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ArambourgianiaEntity.java index 5ec9da3..8fb6206 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ArambourgianiaEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ArambourgianiaEntity.java @@ -63,10 +63,18 @@ import software.bernie.geckolib.animation.*; public class ArambourgianiaEntity extends DinoEntityBase implements GeoEntity, FlyingAnimal { private final AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); + public static final int BABY_TO_ADULT_AGE_TICKS = 43200; + private static final float MIN_ANIMAL_SCALE = 1.7F; + private static final float MAX_ANIMAL_SCALE = 2.1F; + + private float lastDimensionsScale = 1.0F; + private static final EntityDataAccessor VARIANT = SynchedEntityData.defineId(ArambourgianiaEntity.class, EntityDataSerializers.INT); private static final EntityDataAccessor DATA_SYNCED_AGE = SynchedEntityData.defineId(ArambourgianiaEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(ArambourgianiaEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -121,6 +129,10 @@ public class ArambourgianiaEntity extends DinoEntityBase implements GeoEntity, F return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); } + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } + public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() .add(Attributes.MAX_HEALTH, 100D) @@ -164,6 +176,7 @@ public class ArambourgianiaEntity extends DinoEntityBase implements GeoEntity, F if (child instanceof ArambourgianiaEntity baby) { ArambourgianiaVariant randomVariant = Util.getRandom(ArambourgianiaVariant.values(), this.random); baby.setVariant(randomVariant); + baby.setBaby(true); } return child; } @@ -225,6 +238,8 @@ public class ArambourgianiaEntity extends DinoEntityBase implements GeoEntity, F } } + updateDynamicDimensions(); + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; @@ -290,6 +305,7 @@ public class ArambourgianiaEntity extends DinoEntityBase implements GeoEntity, F super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -297,6 +313,7 @@ public class ArambourgianiaEntity extends DinoEntityBase implements GeoEntity, F super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ @@ -304,6 +321,48 @@ public class ArambourgianiaEntity extends DinoEntityBase implements GeoEntity, F return this.entityData.get(DATA_SYNCED_AGE); } + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ + public ArambourgianiaVariant getVariant() { return ArambourgianiaVariant.byId(this.getTypeVariant() & 255); } @@ -327,27 +386,29 @@ public class ArambourgianiaEntity extends DinoEntityBase implements GeoEntity, F public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { ArambourgianiaVariant variant = Util.getRandom(ArambourgianiaVariant.values(), this.random); this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); } /*?} else {*/ /*@Override public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { - ArambourgianiaVariant variant = Util.getRandom(ArambourgianiaVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } + ArambourgianiaVariant variant = Util.getRandom(ArambourgianiaVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} *//*?}*/ @Override public void readAdditionalSaveData(CompoundTag pCompound) { super.readAdditionalSaveData(pCompound); this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } } @Override public void addAdditionalSaveData(CompoundTag pCompound) { super.addAdditionalSaveData(pCompound); pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); } @Override diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/BaryonyxEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/BaryonyxEntity.java index 9afef59..6d47a0b 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/BaryonyxEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/BaryonyxEntity.java @@ -54,10 +54,18 @@ import software.bernie.geckolib.animation.*; public class BaryonyxEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(BaryonyxEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(BaryonyxEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 52800; + private static final float MIN_ANIMAL_SCALE = 1.1F; + private static final float MAX_ANIMAL_SCALE = 1.5F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(BaryonyxEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(BaryonyxEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(BaryonyxEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -106,10 +114,14 @@ public class BaryonyxEntity extends DinoEntityBase implements GeoEntity { return ModBlocks.INCUBATED_BARYONYX_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -123,16 +135,17 @@ public class BaryonyxEntity extends DinoEntityBase implements GeoEntity { } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.BARYONYX.get().create(pLevel); - if (child instanceof BaryonyxEntity baby) { - BaryonyxVariant randomVariant = Util.getRandom(BaryonyxVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.BARYONYX.get().create(pLevel); + if (child instanceof BaryonyxEntity baby) { + BaryonyxVariant randomVariant = Util.getRandom(BaryonyxVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -184,11 +197,13 @@ public class BaryonyxEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -253,6 +268,7 @@ public class BaryonyxEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -260,12 +276,55 @@ public class BaryonyxEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -284,33 +343,35 @@ public class BaryonyxEntity extends DinoEntityBase implements GeoEntity { if (!(other instanceof BaryonyxEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - /*? if <=1.20.1 {*/ - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { - BaryonyxVariant variant = Util.getRandom(BaryonyxVariant.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) { - BaryonyxVariant variant = Util.getRandom(BaryonyxVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } - *//*?}*/ + /*? if <=1.20.1 {*/ + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + BaryonyxVariant variant = Util.getRandom(BaryonyxVariant.values(), this.random); + this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); + return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); + } + /*?} else {*/ + /*@Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + BaryonyxVariant variant = Util.getRandom(BaryonyxVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} + *//*?}*/ @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/BrachiosaurusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/BrachiosaurusEntity.java index ae4081c..63bbdd4 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/BrachiosaurusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/BrachiosaurusEntity.java @@ -55,10 +55,18 @@ import software.bernie.geckolib.animation.*; public class BrachiosaurusEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(BrachiosaurusEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(BrachiosaurusEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 134400; + private static final float MIN_ANIMAL_SCALE = 1.8F; + private static final float MAX_ANIMAL_SCALE = 2.2F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(BrachiosaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(BrachiosaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(BrachiosaurusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -107,10 +115,14 @@ public class BrachiosaurusEntity extends DinoEntityBase implements GeoEntity { return ModBlocks.INCUBATED_BRACHIOSAURUS_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -124,16 +136,17 @@ public class BrachiosaurusEntity extends DinoEntityBase implements GeoEntity { } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.BRACHIOSAURUS.get().create(pLevel); - if (child instanceof BrachiosaurusEntity baby) { - BrachiosaurusVariant randomVariant = Util.getRandom(BrachiosaurusVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.BRACHIOSAURUS.get().create(pLevel); + if (child instanceof BrachiosaurusEntity baby) { + BrachiosaurusVariant randomVariant = Util.getRandom(BrachiosaurusVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -185,11 +198,13 @@ public class BrachiosaurusEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -254,6 +269,7 @@ public class BrachiosaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -261,12 +277,55 @@ public class BrachiosaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -285,33 +344,35 @@ public class BrachiosaurusEntity extends DinoEntityBase implements GeoEntity { if (!(other instanceof BrachiosaurusEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - /*? if <=1.20.1 {*/ - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { - BrachiosaurusVariant variant = Util.getRandom(BrachiosaurusVariant.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) { - BrachiosaurusVariant variant = Util.getRandom(BrachiosaurusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } - *//*?}*/ + /*? if <=1.20.1 {*/ + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + BrachiosaurusVariant variant = Util.getRandom(BrachiosaurusVariant.values(), this.random); + this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); + return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); + } + /*?} else {*/ + /*@Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + BrachiosaurusVariant variant = Util.getRandom(BrachiosaurusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} + *//*?}*/ @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/CarcharodontosaurusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/CarcharodontosaurusEntity.java index 8cef66b..83ba415 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/CarcharodontosaurusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/CarcharodontosaurusEntity.java @@ -57,10 +57,18 @@ import software.bernie.geckolib.animation.*; public class CarcharodontosaurusEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); + public static final int BABY_TO_ADULT_AGE_TICKS = 72000; + private static final float MIN_ANIMAL_SCALE = 1.8F; + private static final float MAX_ANIMAL_SCALE = 2.2F; + + private float lastDimensionsScale = 1.0F; + private static final EntityDataAccessor VARIANT = SynchedEntityData.defineId(CarcharodontosaurusEntity.class, EntityDataSerializers.INT); private static final EntityDataAccessor DATA_SYNCED_AGE = SynchedEntityData.defineId(CarcharodontosaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(CarcharodontosaurusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -114,6 +122,10 @@ public class CarcharodontosaurusEntity extends DinoEntityBase implements GeoEnti return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); } + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } + public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() .add(Attributes.MAX_HEALTH, 80D) @@ -133,6 +145,7 @@ public class CarcharodontosaurusEntity extends DinoEntityBase implements GeoEnti if (child instanceof CarcharodontosaurusEntity baby) { CarcharodontosaurusVariant randomVariant = Util.getRandom(CarcharodontosaurusVariant.values(), this.random); baby.setVariant(randomVariant); + baby.setBaby(true); } return child; } @@ -186,10 +199,12 @@ public class CarcharodontosaurusEntity extends DinoEntityBase implements GeoEnti double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } + } } } + updateDynamicDimensions(); + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; @@ -255,19 +270,58 @@ public class CarcharodontosaurusEntity extends DinoEntityBase implements GeoEnti super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { - super.defineSynchedData(pBuilder); - pBuilder.define(VARIANT, 0); - pBuilder.define(DATA_SYNCED_AGE, 0); - } + super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); pBuilder.define(DATA_ANIMAL_SCALE, 1.0F);} *//*?}*/ public int getSyncedAge() { return this.entityData.get(DATA_SYNCED_AGE); } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale());} + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -290,12 +344,16 @@ public class CarcharodontosaurusEntity extends DinoEntityBase implements GeoEnti public void addAdditionalSaveData(CompoundTag pCompound) { super.addAdditionalSaveData(pCompound); pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); } @Override public void readAdditionalSaveData(CompoundTag pCompound) { super.readAdditionalSaveData(pCompound); this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } } /*? if <=1.20.1 {*/ @@ -303,15 +361,13 @@ public class CarcharodontosaurusEntity extends DinoEntityBase implements GeoEnti public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { CarcharodontosaurusVariant variant = Util.getRandom(CarcharodontosaurusVariant.values(), this.random); this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); } /*?} else {*/ /*@Override public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { - CarcharodontosaurusVariant variant = Util.getRandom(CarcharodontosaurusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } + CarcharodontosaurusVariant variant = Util.getRandom(CarcharodontosaurusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} *//*?}*/ @Override diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/CarnotaurusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/CarnotaurusEntity.java index 1a21e01..59e4715 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/CarnotaurusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/CarnotaurusEntity.java @@ -51,10 +51,18 @@ import software.bernie.geckolib.animation.*; public class CarnotaurusEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(CarnotaurusEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(CarnotaurusEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 43200; + private static final float MIN_ANIMAL_SCALE = 1.3F; + private static final float MAX_ANIMAL_SCALE = 1.7F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(CarnotaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(CarnotaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(CarnotaurusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -104,8 +112,12 @@ public class CarnotaurusEntity extends DinoEntityBase implements GeoEntity { } @Override - public DinoEntityBase.DinoAIConfig getAIConfig() { - return new DinoEntityBase.DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); } public static AttributeSupplier.Builder createAttributes() { @@ -126,6 +138,7 @@ public class CarnotaurusEntity extends DinoEntityBase implements GeoEntity { if (child instanceof CarnotaurusEntity baby) { CarnotaurusVariant randomVariant = Util.getRandom(CarnotaurusVariant.values(), this.random); baby.setVariant(randomVariant); + baby.setBaby(true); } return child; } @@ -179,11 +192,13 @@ public class CarnotaurusEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -248,6 +263,7 @@ public class CarnotaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -255,12 +271,55 @@ public class CarnotaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -279,32 +338,34 @@ public class CarnotaurusEntity extends DinoEntityBase implements GeoEntity { if (!(other instanceof CarnotaurusEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } /*? if <=1.20.1 {*/ @Override public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { CarnotaurusVariant variant = Util.getRandom(CarnotaurusVariant.values(), this.random); this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); } /*?} else {*/ /*@Override public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { - CarnotaurusVariant variant = Util.getRandom(CarnotaurusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } + CarnotaurusVariant variant = Util.getRandom(CarnotaurusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} *//*?}*/ @Override diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/CearadactylusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/CearadactylusEntity.java index 7c36c94..b2f06e5 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/CearadactylusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/CearadactylusEntity.java @@ -63,10 +63,18 @@ import software.bernie.geckolib.animation.*; public class CearadactylusEntity extends DinoEntityBase implements GeoEntity, FlyingAnimal { private final AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(CearadactylusEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(CearadactylusEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 28800; + private static final float MIN_ANIMAL_SCALE = 0.7F; + private static final float MAX_ANIMAL_SCALE = 1.1F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(CearadactylusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(CearadactylusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(CearadactylusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -116,10 +124,14 @@ public class CearadactylusEntity extends DinoEntityBase implements GeoEntity, Fl return ModBlocks.INCUBATED_CEARADACTYLUS_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -157,16 +169,17 @@ public class CearadactylusEntity extends DinoEntityBase implements GeoEntity, Fl } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.CEARADACTYLUS.get().create(pLevel); - if (child instanceof CearadactylusEntity baby) { - CearadactylusVariant randomVariant = Util.getRandom(CearadactylusVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.CEARADACTYLUS.get().create(pLevel); + if (child instanceof CearadactylusEntity baby) { + CearadactylusVariant randomVariant = Util.getRandom(CearadactylusVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -221,11 +234,13 @@ public class CearadactylusEntity extends DinoEntityBase implements GeoEntity, Fl double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -290,6 +305,7 @@ public class CearadactylusEntity extends DinoEntityBase implements GeoEntity, Fl super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -297,12 +313,55 @@ public class CearadactylusEntity extends DinoEntityBase implements GeoEntity, Fl super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public CearadactylusVariant getVariant() { return CearadactylusVariant.byId(this.getTypeVariant() & 255); @@ -327,28 +386,30 @@ public class CearadactylusEntity extends DinoEntityBase implements GeoEntity, Fl public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { CearadactylusVariant variant = Util.getRandom(CearadactylusVariant.values(), this.random); this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); } /*?} else {*/ /*@Override public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { - CearadactylusVariant variant = Util.getRandom(CearadactylusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } + CearadactylusVariant variant = Util.getRandom(CearadactylusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} *//*?}*/ - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - @Override - public void addAdditionalSaveData(CompoundTag pCompound) { - super.addAdditionalSaveData(pCompound); - pCompound.putInt("Variant", this.getTypeVariant()); - } + @Override + public void addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/CeratosaurusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/CeratosaurusEntity.java index 3b9d6ef..40600f4 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/CeratosaurusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/CeratosaurusEntity.java @@ -50,10 +50,18 @@ import software.bernie.geckolib.animation.*; public class CeratosaurusEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(CeratosaurusEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(CeratosaurusEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 38400; + private static final float MIN_ANIMAL_SCALE = 1.9F; + private static final float MAX_ANIMAL_SCALE = 2.3F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(CeratosaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(CeratosaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(CeratosaurusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -107,6 +115,10 @@ public class CeratosaurusEntity extends DinoEntityBase implements GeoEntity { return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); } + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } + public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() .add(Attributes.MAX_HEALTH, 55D) @@ -118,16 +130,17 @@ public class CeratosaurusEntity extends DinoEntityBase implements GeoEntity { .add(Attributes.ATTACK_DAMAGE, 16D ); } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.CERATOSAURUS.get().create(pLevel); - if (child instanceof CeratosaurusEntity baby) { - CeratosaurusVariant randomVariant = Util.getRandom(CeratosaurusVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.CERATOSAURUS.get().create(pLevel); + if (child instanceof CeratosaurusEntity baby) { + CeratosaurusVariant randomVariant = Util.getRandom(CeratosaurusVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -178,11 +191,13 @@ public class CeratosaurusEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -247,6 +262,7 @@ public class CeratosaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -254,12 +270,55 @@ public class CeratosaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); @@ -279,33 +338,35 @@ public class CeratosaurusEntity extends DinoEntityBase implements GeoEntity { if (!(other instanceof CeratosaurusEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - /*? if <=1.20.1 {*/ - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { - CeratosaurusVariant variant = Util.getRandom(CeratosaurusVariant.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) { - CeratosaurusVariant variant = Util.getRandom(CeratosaurusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } - *//*?}*/ + /*? if <=1.20.1 {*/ + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + CeratosaurusVariant variant = Util.getRandom(CeratosaurusVariant.values(), this.random); + this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); + return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); + } + /*?} else {*/ + /*@Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + CeratosaurusVariant variant = Util.getRandom(CeratosaurusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} + *//*?}*/ @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ChasmosaurusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ChasmosaurusEntity.java index a43248d..903f13d 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ChasmosaurusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ChasmosaurusEntity.java @@ -53,10 +53,18 @@ import software.bernie.geckolib.animation.*; public class ChasmosaurusEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(ChasmosaurusEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(ChasmosaurusEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 67200; + private static final float MIN_ANIMAL_SCALE = 1.1F; + private static final float MAX_ANIMAL_SCALE = 1.5F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(ChasmosaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(ChasmosaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(ChasmosaurusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -105,10 +113,14 @@ public class ChasmosaurusEntity extends DinoEntityBase implements GeoEntity { return ModBlocks.INCUBATED_CHASMOSAURUS_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -122,16 +134,17 @@ public class ChasmosaurusEntity extends DinoEntityBase implements GeoEntity { } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.CHASMOSAURUS.get().create(pLevel); - if (child instanceof ChasmosaurusEntity baby) { - ChasmosaurusVariant randomVariant = Util.getRandom(ChasmosaurusVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.CHASMOSAURUS.get().create(pLevel); + if (child instanceof ChasmosaurusEntity baby) { + ChasmosaurusVariant randomVariant = Util.getRandom(ChasmosaurusVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -181,11 +194,13 @@ public class ChasmosaurusEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -250,6 +265,7 @@ public class ChasmosaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -257,12 +273,55 @@ public class ChasmosaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -281,33 +340,35 @@ public class ChasmosaurusEntity extends DinoEntityBase implements GeoEntity { if (!(other instanceof ChasmosaurusEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - /*? if <=1.20.1 {*/ - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { - ChasmosaurusVariant variant = Util.getRandom(ChasmosaurusVariant.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) { - ChasmosaurusVariant variant = Util.getRandom(ChasmosaurusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } - *//*?}*/ + /*? if <=1.20.1 {*/ + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + ChasmosaurusVariant variant = Util.getRandom(ChasmosaurusVariant.values(), this.random); + this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); + return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); + } + /*?} else {*/ + /*@Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + ChasmosaurusVariant variant = Util.getRandom(ChasmosaurusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} + *//*?}*/ @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ChickenosaurusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ChickenosaurusEntity.java index 0f75e02..bd0fdf5 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ChickenosaurusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ChickenosaurusEntity.java @@ -54,10 +54,18 @@ import software.bernie.geckolib.animation.*; public class ChickenosaurusEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(ChickenosaurusEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(ChickenosaurusEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 28800; + private static final float MIN_ANIMAL_SCALE = 0.7F; + private static final float MAX_ANIMAL_SCALE = 1.1F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(ChickenosaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(ChickenosaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(ChickenosaurusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -106,10 +114,14 @@ public class ChickenosaurusEntity extends DinoEntityBase implements GeoEntity { return null; } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -123,16 +135,17 @@ public class ChickenosaurusEntity extends DinoEntityBase implements GeoEntity { } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.CHICKENOSAURUS.get().create(pLevel); - if (child instanceof ChickenosaurusEntity baby) { - ChickenosaurusVariant randomVariant = Util.getRandom(ChickenosaurusVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.CHICKENOSAURUS.get().create(pLevel); + if (child instanceof ChickenosaurusEntity baby) { + ChickenosaurusVariant randomVariant = Util.getRandom(ChickenosaurusVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -182,11 +195,13 @@ public class ChickenosaurusEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -251,6 +266,7 @@ public class ChickenosaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -258,12 +274,55 @@ public class ChickenosaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -282,33 +341,35 @@ public class ChickenosaurusEntity extends DinoEntityBase implements GeoEntity { if (!(other instanceof ChickenosaurusEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - /*? if <=1.20.1 {*/ - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { - ChickenosaurusVariant variant = Util.getRandom(ChickenosaurusVariant.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) { - ChickenosaurusVariant variant = Util.getRandom(ChickenosaurusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } - *//*?}*/ + /*? if <=1.20.1 {*/ + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + ChickenosaurusVariant variant = Util.getRandom(ChickenosaurusVariant.values(), this.random); + this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); + return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); + } + /*?} else {*/ + /*@Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + ChickenosaurusVariant variant = Util.getRandom(ChickenosaurusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} + *//*?}*/ @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ChilesaurusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ChilesaurusEntity.java index f317c91..55d1146 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ChilesaurusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ChilesaurusEntity.java @@ -46,10 +46,18 @@ import software.bernie.geckolib.animation.*; public class ChilesaurusEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(ChilesaurusEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(ChilesaurusEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 38400; + private static final float MIN_ANIMAL_SCALE = 0.4F; + private static final float MAX_ANIMAL_SCALE = 0.8F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(ChilesaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(ChilesaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(ChilesaurusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -98,10 +106,14 @@ public class ChilesaurusEntity extends DinoEntityBase implements GeoEntity { return ModBlocks.INCUBATED_CHILESAURUS_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -115,16 +127,17 @@ public class ChilesaurusEntity extends DinoEntityBase implements GeoEntity { } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.CHILESAURUS.get().create(pLevel); - if (child instanceof ChilesaurusEntity baby) { - ChilesaurusVariant randomVariant = Util.getRandom(ChilesaurusVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.CHILESAURUS.get().create(pLevel); + if (child instanceof ChilesaurusEntity baby) { + ChilesaurusVariant randomVariant = Util.getRandom(ChilesaurusVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -171,11 +184,13 @@ public class ChilesaurusEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -239,6 +254,7 @@ public class ChilesaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -246,12 +262,55 @@ public class ChilesaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -270,33 +329,35 @@ public class ChilesaurusEntity extends DinoEntityBase implements GeoEntity { if (!(other instanceof ChilesaurusEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - /*? if <=1.20.1 {*/ - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { - ChilesaurusVariant variant = Util.getRandom(ChilesaurusVariant.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) { - ChilesaurusVariant variant = Util.getRandom(ChilesaurusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } - *//*?}*/ + /*? if <=1.20.1 {*/ + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + ChilesaurusVariant variant = Util.getRandom(ChilesaurusVariant.values(), this.random); + this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); + return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); + } + /*?} else {*/ + /*@Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + ChilesaurusVariant variant = Util.getRandom(ChilesaurusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} + *//*?}*/ @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/CoelophysisEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/CoelophysisEntity.java index f41b0de..5bfdf47 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/CoelophysisEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/CoelophysisEntity.java @@ -54,10 +54,18 @@ import software.bernie.geckolib.animation.*; public class CoelophysisEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(CoelophysisEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(CoelophysisEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 19200; + private static final float MIN_ANIMAL_SCALE = 0.5F; + private static final float MAX_ANIMAL_SCALE = 0.9F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(CoelophysisEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(CoelophysisEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(CoelophysisEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -106,10 +114,14 @@ public class CoelophysisEntity extends DinoEntityBase implements GeoEntity { return ModBlocks.INCUBATED_COELOPHYSIS_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -123,16 +135,17 @@ public class CoelophysisEntity extends DinoEntityBase implements GeoEntity { } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.COELOPHYSIS.get().create(pLevel); - if (child instanceof CoelophysisEntity baby) { - CoelophysisVariant randomVariant = Util.getRandom(CoelophysisVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.COELOPHYSIS.get().create(pLevel); + if (child instanceof CoelophysisEntity baby) { + CoelophysisVariant randomVariant = Util.getRandom(CoelophysisVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -182,11 +195,13 @@ public class CoelophysisEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -251,6 +266,7 @@ public class CoelophysisEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -258,12 +274,55 @@ public class CoelophysisEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -282,33 +341,35 @@ public class CoelophysisEntity extends DinoEntityBase implements GeoEntity { if (!(other instanceof CoelophysisEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - /*? if <=1.20.1 {*/ - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { - CoelophysisVariant variant = Util.getRandom(CoelophysisVariant.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) { - CoelophysisVariant variant = Util.getRandom(CoelophysisVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } - *//*?}*/ + /*? if <=1.20.1 {*/ + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + CoelophysisVariant variant = Util.getRandom(CoelophysisVariant.values(), this.random); + this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); + return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); + } + /*?} else {*/ + /*@Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + CoelophysisVariant variant = Util.getRandom(CoelophysisVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} + *//*?}*/ @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/CoelurusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/CoelurusEntity.java index 941662a..e79638e 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/CoelurusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/CoelurusEntity.java @@ -54,10 +54,18 @@ import software.bernie.geckolib.animation.*; public class CoelurusEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(CoelurusEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(CoelurusEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 24000; + private static final float MIN_ANIMAL_SCALE = 0.3F; + private static final float MAX_ANIMAL_SCALE = 0.7F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(CoelurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(CoelurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(CoelurusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -106,10 +114,14 @@ public class CoelurusEntity extends DinoEntityBase implements GeoEntity { return ModBlocks.INCUBATED_COELURUS_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -123,16 +135,17 @@ public class CoelurusEntity extends DinoEntityBase implements GeoEntity { } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.COELURUS.get().create(pLevel); - if (child instanceof CoelurusEntity baby) { - CoelurusVariant randomVariant = Util.getRandom(CoelurusVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.COELURUS.get().create(pLevel); + if (child instanceof CoelurusEntity baby) { + CoelurusVariant randomVariant = Util.getRandom(CoelurusVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -182,11 +195,13 @@ public class CoelurusEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -251,6 +266,7 @@ public class CoelurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -258,12 +274,55 @@ public class CoelurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -282,33 +341,35 @@ public class CoelurusEntity extends DinoEntityBase implements GeoEntity { if (!(other instanceof CoelurusEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - /*? if <=1.20.1 {*/ - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { - CoelurusVariant variant = Util.getRandom(CoelurusVariant.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) { - CoelurusVariant variant = Util.getRandom(CoelurusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } - *//*?}*/ + /*? if <=1.20.1 {*/ + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + CoelurusVariant variant = Util.getRandom(CoelurusVariant.values(), this.random); + this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); + return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); + } + /*?} else {*/ + /*@Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + CoelurusVariant variant = Util.getRandom(CoelurusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} + *//*?}*/ @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/CompsognathusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/CompsognathusEntity.java index b08cf71..ce0a398 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/CompsognathusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/CompsognathusEntity.java @@ -9,6 +9,8 @@ import net.cmr.jurassicrevived.entity.ai.SprintingMeleeAttackGoal; import net.cmr.jurassicrevived.entity.ai.SprintingPanicGoal; import net.cmr.jurassicrevived.entity.client.CompsognathusVariant; import net.cmr.jurassicrevived.entity.client.CompsognathusVariant; +import net.cmr.jurassicrevived.entity.client.CompsognathusVariant; +import net.cmr.jurassicrevived.entity.client.CompsognathusVariant; import net.cmr.jurassicrevived.item.ModItems; import net.cmr.jurassicrevived.sound.ModSounds; import net.minecraft.Util; @@ -53,10 +55,18 @@ import software.bernie.geckolib.animation.*; public class CompsognathusEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); + public static final int BABY_TO_ADULT_AGE_TICKS = 14400; + private static final float MIN_ANIMAL_SCALE = 0.2F; + private static final float MAX_ANIMAL_SCALE = 0.6F; + + private float lastDimensionsScale = 1.0F; + private static final EntityDataAccessor VARIANT = SynchedEntityData.defineId(CompsognathusEntity.class, EntityDataSerializers.INT); private static final EntityDataAccessor DATA_SYNCED_AGE = SynchedEntityData.defineId(CompsognathusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(CompsognathusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -110,6 +120,10 @@ public class CompsognathusEntity extends DinoEntityBase implements GeoEntity { return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); } + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } + public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() .add(Attributes.MAX_HEALTH, 5D) @@ -122,16 +136,17 @@ public class CompsognathusEntity extends DinoEntityBase implements GeoEntity { } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.COMPSOGNATHUS.get().create(pLevel); - if (child instanceof CompsognathusEntity baby) { - CompsognathusVariant randomVariant = Util.getRandom(CompsognathusVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.COMPSOGNATHUS.get().create(pLevel); + if (child instanceof CompsognathusEntity baby) { + CompsognathusVariant randomVariant = Util.getRandom(CompsognathusVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -185,6 +200,8 @@ public class CompsognathusEntity extends DinoEntityBase implements GeoEntity { } } + updateDynamicDimensions(); + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; @@ -250,19 +267,59 @@ public class CompsognathusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { - super.defineSynchedData(pBuilder); - pBuilder.define(VARIANT, 0); - pBuilder.define(DATA_SYNCED_AGE, 0); - } + super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); pBuilder.define(DATA_ANIMAL_SCALE, 1.0F);} *//*?}*/ public int getSyncedAge() { return this.entityData.get(DATA_SYNCED_AGE); } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale());} + *//*?}*/ + public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -281,32 +338,34 @@ public class CompsognathusEntity extends DinoEntityBase implements GeoEntity { if (!(other instanceof CompsognathusEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } /*? if <=1.20.1 {*/ @Override public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { CompsognathusVariant variant = Util.getRandom(CompsognathusVariant.values(), this.random); this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); } - /*?} else {*/ - /*@Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { - CompsognathusVariant variant = Util.getRandom(CompsognathusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } + /*?} else {*/ + /*@Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + CompsognathusVariant variant = Util.getRandom(CompsognathusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} *//*?}*/ @Override diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ConcavenatorEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ConcavenatorEntity.java index 78e547e..74cd05d 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ConcavenatorEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ConcavenatorEntity.java @@ -50,10 +50,18 @@ import software.bernie.geckolib.animation.*; public class ConcavenatorEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(ConcavenatorEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(ConcavenatorEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 43200; + private static final float MIN_ANIMAL_SCALE = 0.7F; + private static final float MAX_ANIMAL_SCALE = 1.1F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(ConcavenatorEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(ConcavenatorEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(ConcavenatorEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -107,6 +115,10 @@ public class ConcavenatorEntity extends DinoEntityBase implements GeoEntity { return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); } + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } + public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() .add(Attributes.MAX_HEALTH, 45D) @@ -118,16 +130,17 @@ public class ConcavenatorEntity extends DinoEntityBase implements GeoEntity { .add(Attributes.ATTACK_KNOCKBACK, 0D); } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.CONCAVENATOR.get().create(pLevel); - if (child instanceof ConcavenatorEntity baby) { - ConcavenatorVariant randomVariant = Util.getRandom(ConcavenatorVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.CONCAVENATOR.get().create(pLevel); + if (child instanceof ConcavenatorEntity baby) { + ConcavenatorVariant randomVariant = Util.getRandom(ConcavenatorVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -178,11 +191,13 @@ public class ConcavenatorEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -247,6 +262,7 @@ public class ConcavenatorEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -254,12 +270,55 @@ public class ConcavenatorEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -278,33 +337,35 @@ public class ConcavenatorEntity extends DinoEntityBase implements GeoEntity { if (!(other instanceof ConcavenatorEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - /*? if <=1.20.1 {*/ - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { - ConcavenatorVariant variant = Util.getRandom(ConcavenatorVariant.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) { - ConcavenatorVariant variant = Util.getRandom(ConcavenatorVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } - *//*?}*/ + /*? if <=1.20.1 {*/ + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + ConcavenatorVariant variant = Util.getRandom(ConcavenatorVariant.values(), this.random); + this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); + return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); + } + /*?} else {*/ + /*@Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + ConcavenatorVariant variant = Util.getRandom(ConcavenatorVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} + *//*?}*/ @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/CorythosaurusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/CorythosaurusEntity.java index 757165f..cec01bd 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/CorythosaurusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/CorythosaurusEntity.java @@ -51,10 +51,18 @@ import software.bernie.geckolib.animation.*; public class CorythosaurusEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(CorythosaurusEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(CorythosaurusEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 52800; + private static final float MIN_ANIMAL_SCALE = 1.5F; + private static final float MAX_ANIMAL_SCALE = 1.9F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(CorythosaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(CorythosaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(CorythosaurusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -103,10 +111,14 @@ public class CorythosaurusEntity extends DinoEntityBase implements GeoEntity { return ModBlocks.INCUBATED_CORYTHOSAURUS_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -120,16 +132,17 @@ public class CorythosaurusEntity extends DinoEntityBase implements GeoEntity { } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.CORYTHOSAURUS.get().create(pLevel); - if (child instanceof CorythosaurusEntity baby) { - CorythosaurusVariant randomVariant = Util.getRandom(CorythosaurusVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.CORYTHOSAURUS.get().create(pLevel); + if (child instanceof CorythosaurusEntity baby) { + CorythosaurusVariant randomVariant = Util.getRandom(CorythosaurusVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -179,11 +192,13 @@ public class CorythosaurusEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -248,6 +263,7 @@ public class CorythosaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -255,12 +271,55 @@ public class CorythosaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -279,33 +338,35 @@ public class CorythosaurusEntity extends DinoEntityBase implements GeoEntity { if (!(other instanceof CorythosaurusEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - /*? if <=1.20.1 {*/ - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { - CorythosaurusVariant variant = Util.getRandom(CorythosaurusVariant.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) { - CorythosaurusVariant variant = Util.getRandom(CorythosaurusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } - *//*?}*/ + /*? if <=1.20.1 {*/ + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + CorythosaurusVariant variant = Util.getRandom(CorythosaurusVariant.values(), this.random); + this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); + return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); + } + /*?} else {*/ + /*@Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + CorythosaurusVariant variant = Util.getRandom(CorythosaurusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} + *//*?}*/ @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/DeinonychusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/DeinonychusEntity.java index 976c1f4..a18cb26 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/DeinonychusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/DeinonychusEntity.java @@ -54,10 +54,18 @@ import software.bernie.geckolib.animation.*; public class DeinonychusEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(DeinonychusEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(DeinonychusEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 33600; + private static final float MIN_ANIMAL_SCALE = 0.7F; + private static final float MAX_ANIMAL_SCALE = 1.1F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(DeinonychusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(DeinonychusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(DeinonychusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -106,10 +114,14 @@ public class DeinonychusEntity extends DinoEntityBase implements GeoEntity { return ModBlocks.INCUBATED_DEINONYCHUS_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -123,16 +135,17 @@ public class DeinonychusEntity extends DinoEntityBase implements GeoEntity { } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.DEINONYCHUS.get().create(pLevel); - if (child instanceof DeinonychusEntity baby) { - DeinonychusVariant randomVariant = Util.getRandom(DeinonychusVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.DEINONYCHUS.get().create(pLevel); + if (child instanceof DeinonychusEntity baby) { + DeinonychusVariant randomVariant = Util.getRandom(DeinonychusVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -182,11 +195,13 @@ public class DeinonychusEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -251,6 +266,7 @@ public class DeinonychusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -258,12 +274,55 @@ public class DeinonychusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -282,33 +341,35 @@ public class DeinonychusEntity extends DinoEntityBase implements GeoEntity { if (!(other instanceof DeinonychusEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - /*? if <=1.20.1 {*/ - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { - DeinonychusVariant variant = Util.getRandom(DeinonychusVariant.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) { - DeinonychusVariant variant = Util.getRandom(DeinonychusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } - *//*?}*/ + /*? if <=1.20.1 {*/ + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + DeinonychusVariant variant = Util.getRandom(DeinonychusVariant.values(), this.random); + this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); + return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); + } + /*?} else {*/ + /*@Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + DeinonychusVariant variant = Util.getRandom(DeinonychusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} + *//*?}*/ @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/DilophosaurusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/DilophosaurusEntity.java index e3d3ff5..fd616e5 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/DilophosaurusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/DilophosaurusEntity.java @@ -54,10 +54,18 @@ import software.bernie.geckolib.animation.*; public class DilophosaurusEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(DilophosaurusEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(DilophosaurusEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 33600; + private static final float MIN_ANIMAL_SCALE = 1.0F; + private static final float MAX_ANIMAL_SCALE = 1.4F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(DilophosaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(DilophosaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(DilophosaurusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -106,10 +114,14 @@ public class DilophosaurusEntity extends DinoEntityBase implements GeoEntity { return ModBlocks.INCUBATED_DILOPHOSAURUS_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -123,16 +135,17 @@ public class DilophosaurusEntity extends DinoEntityBase implements GeoEntity { } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.DILOPHOSAURUS.get().create(pLevel); - if (child instanceof DilophosaurusEntity baby) { - DilophosaurusVariant randomVariant = Util.getRandom(DilophosaurusVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.DILOPHOSAURUS.get().create(pLevel); + if (child instanceof DilophosaurusEntity baby) { + DilophosaurusVariant randomVariant = Util.getRandom(DilophosaurusVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -187,11 +200,13 @@ public class DilophosaurusEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -256,6 +271,7 @@ public class DilophosaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -263,12 +279,55 @@ public class DilophosaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -287,33 +346,35 @@ public class DilophosaurusEntity extends DinoEntityBase implements GeoEntity { if (!(other instanceof DilophosaurusEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - /*? if <=1.20.1 {*/ - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { - DilophosaurusVariant variant = Util.getRandom(DilophosaurusVariant.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) { - DilophosaurusVariant variant = Util.getRandom(DilophosaurusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } - *//*?}*/ + /*? if <=1.20.1 {*/ + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + DilophosaurusVariant variant = Util.getRandom(DilophosaurusVariant.values(), this.random); + this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); + return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); + } + /*?} else {*/ + /*@Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + DilophosaurusVariant variant = Util.getRandom(DilophosaurusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} + *//*?}*/ @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/DimorphodonEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/DimorphodonEntity.java index f6211dc..c709200 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/DimorphodonEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/DimorphodonEntity.java @@ -63,10 +63,18 @@ import software.bernie.geckolib.animation.*; public class DimorphodonEntity extends DinoEntityBase implements GeoEntity, FlyingAnimal { private final AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(DimorphodonEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(DimorphodonEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 19200; + private static final float MIN_ANIMAL_SCALE = 0.5F; + private static final float MAX_ANIMAL_SCALE = 0.9F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(DimorphodonEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(DimorphodonEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(DimorphodonEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -116,10 +124,14 @@ public class DimorphodonEntity extends DinoEntityBase implements GeoEntity, Flyi return ModBlocks.INCUBATED_DIMORPHODON_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -157,16 +169,17 @@ public class DimorphodonEntity extends DinoEntityBase implements GeoEntity, Flyi } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.DIMORPHODON.get().create(pLevel); - if (child instanceof DimorphodonEntity baby) { - DimorphodonVariant randomVariant = Util.getRandom(DimorphodonVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.DIMORPHODON.get().create(pLevel); + if (child instanceof DimorphodonEntity baby) { + DimorphodonVariant randomVariant = Util.getRandom(DimorphodonVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -221,11 +234,13 @@ public class DimorphodonEntity extends DinoEntityBase implements GeoEntity, Flyi double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -290,6 +305,7 @@ public class DimorphodonEntity extends DinoEntityBase implements GeoEntity, Flyi super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -297,12 +313,55 @@ public class DimorphodonEntity extends DinoEntityBase implements GeoEntity, Flyi super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public DimorphodonVariant getVariant() { return DimorphodonVariant.byId(this.getTypeVariant() & 255); @@ -327,28 +386,30 @@ public class DimorphodonEntity extends DinoEntityBase implements GeoEntity, Flyi public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { DimorphodonVariant variant = Util.getRandom(DimorphodonVariant.values(), this.random); this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); } /*?} else {*/ /*@Override public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { - DimorphodonVariant variant = Util.getRandom(DimorphodonVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } + DimorphodonVariant variant = Util.getRandom(DimorphodonVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} *//*?}*/ - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - @Override - public void addAdditionalSaveData(CompoundTag pCompound) { - super.addAdditionalSaveData(pCompound); - pCompound.putInt("Variant", this.getTypeVariant()); - } + @Override + public void addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/DiplodocusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/DiplodocusEntity.java index e371841..7e956cd 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/DiplodocusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/DiplodocusEntity.java @@ -55,10 +55,18 @@ import software.bernie.geckolib.animation.*; public class DiplodocusEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(DiplodocusEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(DiplodocusEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 110400; + private static final float MIN_ANIMAL_SCALE = 2.6F; + private static final float MAX_ANIMAL_SCALE = 3.0F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(DiplodocusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(DiplodocusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(DiplodocusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -107,10 +115,14 @@ public class DiplodocusEntity extends DinoEntityBase implements GeoEntity { return ModBlocks.INCUBATED_DIPLODOCUS_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -124,16 +136,17 @@ public class DiplodocusEntity extends DinoEntityBase implements GeoEntity { } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.DIPLODOCUS.get().create(pLevel); - if (child instanceof DiplodocusEntity baby) { - DiplodocusVariant randomVariant = Util.getRandom(DiplodocusVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.DIPLODOCUS.get().create(pLevel); + if (child instanceof DiplodocusEntity baby) { + DiplodocusVariant randomVariant = Util.getRandom(DiplodocusVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -184,11 +197,13 @@ public class DiplodocusEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -253,6 +268,7 @@ public class DiplodocusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -260,12 +276,55 @@ public class DiplodocusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -284,33 +343,35 @@ public class DiplodocusEntity extends DinoEntityBase implements GeoEntity { if (!(other instanceof DiplodocusEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - /*? if <=1.20.1 {*/ - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { - DiplodocusVariant variant = Util.getRandom(DiplodocusVariant.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) { - DiplodocusVariant variant = Util.getRandom(DiplodocusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } - *//*?}*/ + /*? if <=1.20.1 {*/ + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + DiplodocusVariant variant = Util.getRandom(DiplodocusVariant.values(), this.random); + this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); + return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); + } + /*?} else {*/ + /*@Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + DiplodocusVariant variant = Util.getRandom(DiplodocusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} + *//*?}*/ @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/DistortusRexEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/DistortusRexEntity.java index a613396..3f48053 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/DistortusRexEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/DistortusRexEntity.java @@ -57,10 +57,18 @@ import software.bernie.geckolib.animation.*; public class DistortusRexEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); + public static final int BABY_TO_ADULT_AGE_TICKS = 62400; + private static final float MIN_ANIMAL_SCALE = 3.2F; + private static final float MAX_ANIMAL_SCALE = 3.6F; + + private float lastDimensionsScale = 1.0F; + private static final EntityDataAccessor VARIANT = SynchedEntityData.defineId(DistortusRexEntity.class, EntityDataSerializers.INT); private static final EntityDataAccessor DATA_SYNCED_AGE = SynchedEntityData.defineId(DistortusRexEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(DistortusRexEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -114,6 +122,10 @@ public class DistortusRexEntity extends DinoEntityBase implements GeoEntity { return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); } + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } + public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() .add(Attributes.MAX_HEALTH, 120D) @@ -133,6 +145,7 @@ public class DistortusRexEntity extends DinoEntityBase implements GeoEntity { if (child instanceof DistortusRexEntity baby) { DistortusRexVariant randomVariant = Util.getRandom(DistortusRexVariant.values(), this.random); baby.setVariant(randomVariant); + baby.setBaby(true); } return child; } @@ -186,10 +199,12 @@ public class DistortusRexEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } + } } } + updateDynamicDimensions(); + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; @@ -255,19 +270,58 @@ public class DistortusRexEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { - super.defineSynchedData(pBuilder); - pBuilder.define(VARIANT, 0); - pBuilder.define(DATA_SYNCED_AGE, 0); - } + super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); pBuilder.define(DATA_ANIMAL_SCALE, 1.0F);} *//*?}*/ public int getSyncedAge() { return this.entityData.get(DATA_SYNCED_AGE); } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale());} + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -290,12 +344,16 @@ public class DistortusRexEntity extends DinoEntityBase implements GeoEntity { public void addAdditionalSaveData(CompoundTag pCompound) { super.addAdditionalSaveData(pCompound); pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); } @Override public void readAdditionalSaveData(CompoundTag pCompound) { super.readAdditionalSaveData(pCompound); this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } } /*? if <=1.20.1 {*/ @@ -303,15 +361,13 @@ public class DistortusRexEntity extends DinoEntityBase implements GeoEntity { public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { DistortusRexVariant variant = Util.getRandom(DistortusRexVariant.values(), this.random); this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); } /*?} else {*/ /*@Override public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { - DistortusRexVariant variant = Util.getRandom(DistortusRexVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } + DistortusRexVariant variant = Util.getRandom(DistortusRexVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} *//*?}*/ @Override diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/DryosaurusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/DryosaurusEntity.java index 1460306..73a3ee6 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/DryosaurusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/DryosaurusEntity.java @@ -51,10 +51,18 @@ import software.bernie.geckolib.animation.*; public class DryosaurusEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(DryosaurusEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(DryosaurusEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 28800; + private static final float MIN_ANIMAL_SCALE = 0.25F; + private static final float MAX_ANIMAL_SCALE = 0.65F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(DryosaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(DryosaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(DryosaurusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -103,10 +111,14 @@ public class DryosaurusEntity extends DinoEntityBase implements GeoEntity { return ModBlocks.INCUBATED_DRYOSAURUS_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -120,16 +132,17 @@ public class DryosaurusEntity extends DinoEntityBase implements GeoEntity { } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.DRYOSAURUS.get().create(pLevel); - if (child instanceof DryosaurusEntity baby) { - DryosaurusVariant randomVariant = Util.getRandom(DryosaurusVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.DRYOSAURUS.get().create(pLevel); + if (child instanceof DryosaurusEntity baby) { + DryosaurusVariant randomVariant = Util.getRandom(DryosaurusVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -179,11 +192,13 @@ public class DryosaurusEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -248,6 +263,7 @@ public class DryosaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -255,12 +271,55 @@ public class DryosaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -279,33 +338,35 @@ public class DryosaurusEntity extends DinoEntityBase implements GeoEntity { if (!(other instanceof DryosaurusEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - /*? if <=1.20.1 {*/ - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { - DryosaurusVariant variant = Util.getRandom(DryosaurusVariant.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) { - DryosaurusVariant variant = Util.getRandom(DryosaurusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } - *//*?}*/ + /*? if <=1.20.1 {*/ + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + DryosaurusVariant variant = Util.getRandom(DryosaurusVariant.values(), this.random); + this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); + return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); + } + /*?} else {*/ + /*@Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + DryosaurusVariant variant = Util.getRandom(DryosaurusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} + *//*?}*/ @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/EdmontosaurusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/EdmontosaurusEntity.java index 9d748ee..ae30537 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/EdmontosaurusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/EdmontosaurusEntity.java @@ -51,10 +51,18 @@ import software.bernie.geckolib.animation.*; public class EdmontosaurusEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(EdmontosaurusEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(EdmontosaurusEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 67200; + private static final float MIN_ANIMAL_SCALE = 1.6F; + private static final float MAX_ANIMAL_SCALE = 2.0F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(EdmontosaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(EdmontosaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(EdmontosaurusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -103,10 +111,14 @@ public class EdmontosaurusEntity extends DinoEntityBase implements GeoEntity { return ModBlocks.INCUBATED_EDMONTOSAURUS_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -120,16 +132,17 @@ public class EdmontosaurusEntity extends DinoEntityBase implements GeoEntity { } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.EDMONTOSAURUS.get().create(pLevel); - if (child instanceof EdmontosaurusEntity baby) { - EdmontosaurusVariant randomVariant = Util.getRandom(EdmontosaurusVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.EDMONTOSAURUS.get().create(pLevel); + if (child instanceof EdmontosaurusEntity baby) { + EdmontosaurusVariant randomVariant = Util.getRandom(EdmontosaurusVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -179,11 +192,13 @@ public class EdmontosaurusEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -248,6 +263,7 @@ public class EdmontosaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -255,12 +271,55 @@ public class EdmontosaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -279,33 +338,35 @@ public class EdmontosaurusEntity extends DinoEntityBase implements GeoEntity { if (!(other instanceof EdmontosaurusEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - /*? if <=1.20.1 {*/ - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { - EdmontosaurusVariant variant = Util.getRandom(EdmontosaurusVariant.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) { - EdmontosaurusVariant variant = Util.getRandom(EdmontosaurusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } - *//*?}*/ + /*? if <=1.20.1 {*/ + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + EdmontosaurusVariant variant = Util.getRandom(EdmontosaurusVariant.values(), this.random); + this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); + return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); + } + /*?} else {*/ + /*@Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + EdmontosaurusVariant variant = Util.getRandom(EdmontosaurusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} + *//*?}*/ @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/FDuckEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/FDuckEntity.java index caae834..e39e9a4 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/FDuckEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/FDuckEntity.java @@ -54,10 +54,18 @@ import software.bernie.geckolib.animation.*; public class FDuckEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(FDuckEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(FDuckEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 28800; + private static final float MIN_ANIMAL_SCALE = 1.2F; + private static final float MAX_ANIMAL_SCALE = 1.6F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(FDuckEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(FDuckEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(FDuckEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -106,10 +114,14 @@ public class FDuckEntity extends DinoEntityBase implements GeoEntity { return null; } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -123,16 +135,17 @@ public class FDuckEntity extends DinoEntityBase implements GeoEntity { } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.FDUCK.get().create(pLevel); - if (child instanceof FDuckEntity baby) { - FDuckVariant randomVariant = Util.getRandom(FDuckVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.FDUCK.get().create(pLevel); + if (child instanceof FDuckEntity baby) { + FDuckVariant randomVariant = Util.getRandom(FDuckVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -182,11 +195,13 @@ public class FDuckEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -251,6 +266,7 @@ public class FDuckEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -258,12 +274,55 @@ public class FDuckEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -282,33 +341,35 @@ public class FDuckEntity extends DinoEntityBase implements GeoEntity { if (!(other instanceof FDuckEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - /*? if <=1.20.1 {*/ - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { - FDuckVariant variant = Util.getRandom(FDuckVariant.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) { - FDuckVariant variant = Util.getRandom(FDuckVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } - *//*?}*/ + /*? if <=1.20.1 {*/ + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + FDuckVariant variant = Util.getRandom(FDuckVariant.values(), this.random); + this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); + return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); + } + /*?} else {*/ + /*@Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + FDuckVariant variant = Util.getRandom(FDuckVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} + *//*?}*/ @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/GallimimusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/GallimimusEntity.java index 29c194a..f2b8ec1 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/GallimimusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/GallimimusEntity.java @@ -51,10 +51,18 @@ import software.bernie.geckolib.animation.*; public class GallimimusEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(GallimimusEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(GallimimusEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 33600; + private static final float MIN_ANIMAL_SCALE = 0.8F; + private static final float MAX_ANIMAL_SCALE = 1.2F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(GallimimusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(GallimimusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(GallimimusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -103,10 +111,14 @@ public class GallimimusEntity extends DinoEntityBase implements GeoEntity { return ModBlocks.INCUBATED_GALLIMIMUS_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -120,16 +132,17 @@ public class GallimimusEntity extends DinoEntityBase implements GeoEntity { } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.GALLIMIMUS.get().create(pLevel); - if (child instanceof GallimimusEntity baby) { - GallimimusVariant randomVariant = Util.getRandom(GallimimusVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.GALLIMIMUS.get().create(pLevel); + if (child instanceof GallimimusEntity baby) { + GallimimusVariant randomVariant = Util.getRandom(GallimimusVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -179,11 +192,13 @@ public class GallimimusEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -248,6 +263,7 @@ public class GallimimusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -255,12 +271,55 @@ public class GallimimusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -279,33 +338,35 @@ public class GallimimusEntity extends DinoEntityBase implements GeoEntity { if (!(other instanceof GallimimusEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - /*? if <=1.20.1 {*/ - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { - GallimimusVariant variant = Util.getRandom(GallimimusVariant.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) { - GallimimusVariant variant = Util.getRandom(GallimimusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } - *//*?}*/ + /*? if <=1.20.1 {*/ + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + GallimimusVariant variant = Util.getRandom(GallimimusVariant.values(), this.random); + this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); + return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); + } + /*?} else {*/ + /*@Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + GallimimusVariant variant = Util.getRandom(GallimimusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} + *//*?}*/ @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/GeosternbergiaEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/GeosternbergiaEntity.java index 5f42265..5ee10aa 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/GeosternbergiaEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/GeosternbergiaEntity.java @@ -63,10 +63,18 @@ import software.bernie.geckolib.animation.*; public class GeosternbergiaEntity extends DinoEntityBase implements GeoEntity, FlyingAnimal { private final AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(GeosternbergiaEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(GeosternbergiaEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 28800; + private static final float MIN_ANIMAL_SCALE = 1.2F; + private static final float MAX_ANIMAL_SCALE = 1.6F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(GeosternbergiaEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(GeosternbergiaEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(GeosternbergiaEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -116,10 +124,14 @@ public class GeosternbergiaEntity extends DinoEntityBase implements GeoEntity, F return ModBlocks.INCUBATED_GEOSTERNBERGIA_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -157,16 +169,17 @@ public class GeosternbergiaEntity extends DinoEntityBase implements GeoEntity, F } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.GEOSTERNBERGIA.get().create(pLevel); - if (child instanceof GeosternbergiaEntity baby) { - GeosternbergiaVariant randomVariant = Util.getRandom(GeosternbergiaVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.GEOSTERNBERGIA.get().create(pLevel); + if (child instanceof GeosternbergiaEntity baby) { + GeosternbergiaVariant randomVariant = Util.getRandom(GeosternbergiaVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -221,11 +234,13 @@ public class GeosternbergiaEntity extends DinoEntityBase implements GeoEntity, F double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -290,6 +305,7 @@ public class GeosternbergiaEntity extends DinoEntityBase implements GeoEntity, F super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -297,12 +313,55 @@ public class GeosternbergiaEntity extends DinoEntityBase implements GeoEntity, F super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public GeosternbergiaVariant getVariant() { return GeosternbergiaVariant.byId(this.getTypeVariant() & 255); @@ -327,28 +386,30 @@ public class GeosternbergiaEntity extends DinoEntityBase implements GeoEntity, F public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { GeosternbergiaVariant variant = Util.getRandom(GeosternbergiaVariant.values(), this.random); this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); } /*?} else {*/ /*@Override public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { - GeosternbergiaVariant variant = Util.getRandom(GeosternbergiaVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } + GeosternbergiaVariant variant = Util.getRandom(GeosternbergiaVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} *//*?}*/ - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - @Override - public void addAdditionalSaveData(CompoundTag pCompound) { - super.addAdditionalSaveData(pCompound); - pCompound.putInt("Variant", this.getTypeVariant()); - } + @Override + public void addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/GiganotosaurusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/GiganotosaurusEntity.java index 5978afb..925c061 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/GiganotosaurusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/GiganotosaurusEntity.java @@ -57,10 +57,18 @@ import software.bernie.geckolib.animation.*; public class GiganotosaurusEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); + public static final int BABY_TO_ADULT_AGE_TICKS = 81600; + private static final float MIN_ANIMAL_SCALE = 2.0F; + private static final float MAX_ANIMAL_SCALE = 2.4F; + + private float lastDimensionsScale = 1.0F; + private static final EntityDataAccessor VARIANT = SynchedEntityData.defineId(GiganotosaurusEntity.class, EntityDataSerializers.INT); private static final EntityDataAccessor DATA_SYNCED_AGE = SynchedEntityData.defineId(GiganotosaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(GiganotosaurusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -114,6 +122,10 @@ public class GiganotosaurusEntity extends DinoEntityBase implements GeoEntity { return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); } + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } + public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() .add(Attributes.MAX_HEALTH, 80D) @@ -133,6 +145,7 @@ public class GiganotosaurusEntity extends DinoEntityBase implements GeoEntity { if (child instanceof GiganotosaurusEntity baby) { GiganotosaurusVariant randomVariant = Util.getRandom(GiganotosaurusVariant.values(), this.random); baby.setVariant(randomVariant); + baby.setBaby(true); } return child; } @@ -186,10 +199,12 @@ public class GiganotosaurusEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } + } } } + updateDynamicDimensions(); + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; @@ -255,19 +270,58 @@ public class GiganotosaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { - super.defineSynchedData(pBuilder); - pBuilder.define(VARIANT, 0); - pBuilder.define(DATA_SYNCED_AGE, 0); - } + super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); pBuilder.define(DATA_ANIMAL_SCALE, 1.0F);} *//*?}*/ public int getSyncedAge() { return this.entityData.get(DATA_SYNCED_AGE); } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale());} + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -290,12 +344,16 @@ public class GiganotosaurusEntity extends DinoEntityBase implements GeoEntity { public void addAdditionalSaveData(CompoundTag pCompound) { super.addAdditionalSaveData(pCompound); pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); } @Override public void readAdditionalSaveData(CompoundTag pCompound) { super.readAdditionalSaveData(pCompound); this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } } /*? if <=1.20.1 {*/ @@ -303,15 +361,13 @@ public class GiganotosaurusEntity extends DinoEntityBase implements GeoEntity { public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { GiganotosaurusVariant variant = Util.getRandom(GiganotosaurusVariant.values(), this.random); this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); } /*?} else {*/ /*@Override public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { - GiganotosaurusVariant variant = Util.getRandom(GiganotosaurusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } + GiganotosaurusVariant variant = Util.getRandom(GiganotosaurusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} *//*?}*/ @Override diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/GuanlongEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/GuanlongEntity.java index aa23a4d..d01cc6e 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/GuanlongEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/GuanlongEntity.java @@ -55,10 +55,18 @@ import software.bernie.geckolib.animation.*; public class GuanlongEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(GuanlongEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(GuanlongEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 33600; + private static final float MIN_ANIMAL_SCALE = 0.4F; + private static final float MAX_ANIMAL_SCALE = 0.8F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(GuanlongEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(GuanlongEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(GuanlongEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -107,10 +115,14 @@ public class GuanlongEntity extends DinoEntityBase implements GeoEntity { return ModBlocks.INCUBATED_GUANLONG_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -124,16 +136,17 @@ public class GuanlongEntity extends DinoEntityBase implements GeoEntity { } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.GUANLONG.get().create(pLevel); - if (child instanceof GuanlongEntity baby) { - GuanlongVariant randomVariant = Util.getRandom(GuanlongVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.GUANLONG.get().create(pLevel); + if (child instanceof GuanlongEntity baby) { + GuanlongVariant randomVariant = Util.getRandom(GuanlongVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -183,11 +196,13 @@ public class GuanlongEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -252,6 +267,7 @@ public class GuanlongEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -259,12 +275,55 @@ public class GuanlongEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -283,33 +342,35 @@ public class GuanlongEntity extends DinoEntityBase implements GeoEntity { if (!(other instanceof GuanlongEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - /*? if <=1.20.1 {*/ - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { - GuanlongVariant variant = Util.getRandom(GuanlongVariant.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) { - GuanlongVariant variant = Util.getRandom(GuanlongVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } - *//*?}*/ + /*? if <=1.20.1 {*/ + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + GuanlongVariant variant = Util.getRandom(GuanlongVariant.values(), this.random); + this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); + return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); + } + /*?} else {*/ + /*@Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + GuanlongVariant variant = Util.getRandom(GuanlongVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} + *//*?}*/ @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/GuidracoEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/GuidracoEntity.java index 454361f..fc002c1 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/GuidracoEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/GuidracoEntity.java @@ -63,10 +63,18 @@ import software.bernie.geckolib.animation.*; public class GuidracoEntity extends DinoEntityBase implements GeoEntity, FlyingAnimal { private final AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(GuidracoEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(GuidracoEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 28800; + private static final float MIN_ANIMAL_SCALE = 0.6F; + private static final float MAX_ANIMAL_SCALE = 1.0F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(GuidracoEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(GuidracoEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(GuidracoEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -116,10 +124,14 @@ public class GuidracoEntity extends DinoEntityBase implements GeoEntity, FlyingA return ModBlocks.INCUBATED_GUIDRACO_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -157,16 +169,17 @@ public class GuidracoEntity extends DinoEntityBase implements GeoEntity, FlyingA } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.GUIDRACO.get().create(pLevel); - if (child instanceof GuidracoEntity baby) { - GuidracoVariant randomVariant = Util.getRandom(GuidracoVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.GUIDRACO.get().create(pLevel); + if (child instanceof GuidracoEntity baby) { + GuidracoVariant randomVariant = Util.getRandom(GuidracoVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -221,11 +234,13 @@ public class GuidracoEntity extends DinoEntityBase implements GeoEntity, FlyingA double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -290,6 +305,7 @@ public class GuidracoEntity extends DinoEntityBase implements GeoEntity, FlyingA super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -297,12 +313,55 @@ public class GuidracoEntity extends DinoEntityBase implements GeoEntity, FlyingA super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public GuidracoVariant getVariant() { return GuidracoVariant.byId(this.getTypeVariant() & 255); @@ -327,28 +386,30 @@ public class GuidracoEntity extends DinoEntityBase implements GeoEntity, FlyingA public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { GuidracoVariant variant = Util.getRandom(GuidracoVariant.values(), this.random); this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); } /*?} else {*/ /*@Override public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { - GuidracoVariant variant = Util.getRandom(GuidracoVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } + GuidracoVariant variant = Util.getRandom(GuidracoVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} *//*?}*/ - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - @Override - public void addAdditionalSaveData(CompoundTag pCompound) { - super.addAdditionalSaveData(pCompound); - pCompound.putInt("Variant", this.getTypeVariant()); - } + @Override + public void addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/HadrosaurusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/HadrosaurusEntity.java index 49fa211..981355d 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/HadrosaurusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/HadrosaurusEntity.java @@ -51,10 +51,18 @@ import software.bernie.geckolib.animation.*; public class HadrosaurusEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(HadrosaurusEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(HadrosaurusEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 52800; + private static final float MIN_ANIMAL_SCALE = 1.3F; + private static final float MAX_ANIMAL_SCALE = 1.7F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(HadrosaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(HadrosaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(HadrosaurusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -103,10 +111,14 @@ public class HadrosaurusEntity extends DinoEntityBase implements GeoEntity { return ModBlocks.INCUBATED_HADROSAURUS_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -120,16 +132,17 @@ public class HadrosaurusEntity extends DinoEntityBase implements GeoEntity { } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.HADROSAURUS.get().create(pLevel); - if (child instanceof HadrosaurusEntity baby) { - HadrosaurusVariant randomVariant = Util.getRandom(HadrosaurusVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.HADROSAURUS.get().create(pLevel); + if (child instanceof HadrosaurusEntity baby) { + HadrosaurusVariant randomVariant = Util.getRandom(HadrosaurusVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -179,11 +192,13 @@ public class HadrosaurusEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -248,6 +263,7 @@ public class HadrosaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -255,12 +271,55 @@ public class HadrosaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -279,33 +338,35 @@ public class HadrosaurusEntity extends DinoEntityBase implements GeoEntity { if (!(other instanceof HadrosaurusEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - /*? if <=1.20.1 {*/ - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { - HadrosaurusVariant variant = Util.getRandom(HadrosaurusVariant.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) { - HadrosaurusVariant variant = Util.getRandom(HadrosaurusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } - *//*?}*/ + /*? if <=1.20.1 {*/ + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + HadrosaurusVariant variant = Util.getRandom(HadrosaurusVariant.values(), this.random); + this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); + return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); + } + /*?} else {*/ + /*@Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + HadrosaurusVariant variant = Util.getRandom(HadrosaurusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} + *//*?}*/ @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/HerrerasaurusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/HerrerasaurusEntity.java index 8fd4609..28ee015 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/HerrerasaurusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/HerrerasaurusEntity.java @@ -55,10 +55,18 @@ import software.bernie.geckolib.animation.*; public class HerrerasaurusEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(HerrerasaurusEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(HerrerasaurusEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 28800; + private static final float MIN_ANIMAL_SCALE = 1.1F; + private static final float MAX_ANIMAL_SCALE = 1.5F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(HerrerasaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(HerrerasaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(HerrerasaurusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -107,10 +115,14 @@ public class HerrerasaurusEntity extends DinoEntityBase implements GeoEntity { return ModBlocks.INCUBATED_HERRERASAURUS_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -124,16 +136,17 @@ public class HerrerasaurusEntity extends DinoEntityBase implements GeoEntity { } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.HERRERASAURUS.get().create(pLevel); - if (child instanceof HerrerasaurusEntity baby) { - HerrerasaurusVariant randomVariant = Util.getRandom(HerrerasaurusVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.HERRERASAURUS.get().create(pLevel); + if (child instanceof HerrerasaurusEntity baby) { + HerrerasaurusVariant randomVariant = Util.getRandom(HerrerasaurusVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -184,11 +197,13 @@ public class HerrerasaurusEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -253,6 +268,7 @@ public class HerrerasaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -260,12 +276,55 @@ public class HerrerasaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -284,33 +343,35 @@ public class HerrerasaurusEntity extends DinoEntityBase implements GeoEntity { if (!(other instanceof HerrerasaurusEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - /*? if <=1.20.1 {*/ - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { - HerrerasaurusVariant variant = Util.getRandom(HerrerasaurusVariant.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) { - HerrerasaurusVariant variant = Util.getRandom(HerrerasaurusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } - *//*?}*/ + /*? if <=1.20.1 {*/ + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + HerrerasaurusVariant variant = Util.getRandom(HerrerasaurusVariant.values(), this.random); + this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); + return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); + } + /*?} else {*/ + /*@Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + HerrerasaurusVariant variant = Util.getRandom(HerrerasaurusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} + *//*?}*/ @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/HypsilophodonEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/HypsilophodonEntity.java index e20c16c..04c7cb6 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/HypsilophodonEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/HypsilophodonEntity.java @@ -51,10 +51,18 @@ import software.bernie.geckolib.animation.*; public class HypsilophodonEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(HypsilophodonEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(HypsilophodonEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 24000; + private static final float MIN_ANIMAL_SCALE = 0.3F; + private static final float MAX_ANIMAL_SCALE = 0.7F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(HypsilophodonEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(HypsilophodonEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(HypsilophodonEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -103,10 +111,14 @@ public class HypsilophodonEntity extends DinoEntityBase implements GeoEntity { return ModBlocks.INCUBATED_HYPSILOPHODON_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -120,16 +132,17 @@ public class HypsilophodonEntity extends DinoEntityBase implements GeoEntity { } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.HYPSILOPHODON.get().create(pLevel); - if (child instanceof HypsilophodonEntity baby) { - HypsilophodonVariant randomVariant = Util.getRandom(HypsilophodonVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.HYPSILOPHODON.get().create(pLevel); + if (child instanceof HypsilophodonEntity baby) { + HypsilophodonVariant randomVariant = Util.getRandom(HypsilophodonVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -179,11 +192,13 @@ public class HypsilophodonEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -248,6 +263,7 @@ public class HypsilophodonEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -255,12 +271,55 @@ public class HypsilophodonEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -279,33 +338,35 @@ public class HypsilophodonEntity extends DinoEntityBase implements GeoEntity { if (!(other instanceof HypsilophodonEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - /*? if <=1.20.1 {*/ - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { - HypsilophodonVariant variant = Util.getRandom(HypsilophodonVariant.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) { - HypsilophodonVariant variant = Util.getRandom(HypsilophodonVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } - *//*?}*/ + /*? if <=1.20.1 {*/ + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + HypsilophodonVariant variant = Util.getRandom(HypsilophodonVariant.values(), this.random); + this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); + return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); + } + /*?} else {*/ + /*@Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + HypsilophodonVariant variant = Util.getRandom(HypsilophodonVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} + *//*?}*/ @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/IndominusRexEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/IndominusRexEntity.java index 663fdd5..603a27a 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/IndominusRexEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/IndominusRexEntity.java @@ -56,10 +56,18 @@ import software.bernie.geckolib.animation.*; public class IndominusRexEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(IndominusRexEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(IndominusRexEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 50400; + private static final float MIN_ANIMAL_SCALE = 2.8F; + private static final float MAX_ANIMAL_SCALE = 3.2F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(IndominusRexEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(IndominusRexEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(IndominusRexEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -108,10 +116,14 @@ public class IndominusRexEntity extends DinoEntityBase implements GeoEntity { return ModBlocks.INCUBATED_INDOMINUS_REX_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -125,16 +137,17 @@ public class IndominusRexEntity extends DinoEntityBase implements GeoEntity { } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.INDOMINUS_REX.get().create(pLevel); - if (child instanceof IndominusRexEntity baby) { - IndominusRexVariant randomVariant = Util.getRandom(IndominusRexVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.INDOMINUS_REX.get().create(pLevel); + if (child instanceof IndominusRexEntity baby) { + IndominusRexVariant randomVariant = Util.getRandom(IndominusRexVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -185,11 +198,13 @@ public class IndominusRexEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -254,6 +269,7 @@ public class IndominusRexEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -261,12 +277,55 @@ public class IndominusRexEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -285,33 +344,35 @@ public class IndominusRexEntity extends DinoEntityBase implements GeoEntity { if (!(other instanceof IndominusRexEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - /*? if <=1.20.1 {*/ - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { - IndominusRexVariant variant = Util.getRandom(IndominusRexVariant.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) { - IndominusRexVariant variant = Util.getRandom(IndominusRexVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } - *//*?}*/ + /*? if <=1.20.1 {*/ + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + IndominusRexVariant variant = Util.getRandom(IndominusRexVariant.values(), this.random); + this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); + return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); + } + /*?} else {*/ + /*@Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + IndominusRexVariant variant = Util.getRandom(IndominusRexVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} + *//*?}*/ @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/IndoraptorEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/IndoraptorEntity.java index b874a17..51e71d9 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/IndoraptorEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/IndoraptorEntity.java @@ -54,10 +54,18 @@ import software.bernie.geckolib.animation.*; public class IndoraptorEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(IndoraptorEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(IndoraptorEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 24000; + private static final float MIN_ANIMAL_SCALE = 1.6F; + private static final float MAX_ANIMAL_SCALE = 2.0F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(IndoraptorEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(IndoraptorEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(IndoraptorEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -106,10 +114,14 @@ public class IndoraptorEntity extends DinoEntityBase implements GeoEntity { return ModBlocks.INCUBATED_INDORAPTOR_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -123,16 +135,17 @@ public class IndoraptorEntity extends DinoEntityBase implements GeoEntity { } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.INDORAPTOR.get().create(pLevel); - if (child instanceof IndoraptorEntity baby) { - IndoraptorVariant randomVariant = Util.getRandom(IndoraptorVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.INDORAPTOR.get().create(pLevel); + if (child instanceof IndoraptorEntity baby) { + IndoraptorVariant randomVariant = Util.getRandom(IndoraptorVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -183,11 +196,13 @@ public class IndoraptorEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -252,6 +267,7 @@ public class IndoraptorEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -259,12 +275,55 @@ public class IndoraptorEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -283,33 +342,35 @@ public class IndoraptorEntity extends DinoEntityBase implements GeoEntity { if (!(other instanceof IndoraptorEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - /*? if <=1.20.1 {*/ - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { - IndoraptorVariant variant = Util.getRandom(IndoraptorVariant.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) { - IndoraptorVariant variant = Util.getRandom(IndoraptorVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } - *//*?}*/ + /*? if <=1.20.1 {*/ + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + IndoraptorVariant variant = Util.getRandom(IndoraptorVariant.values(), this.random); + this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); + return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); + } + /*?} else {*/ + /*@Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + IndoraptorVariant variant = Util.getRandom(IndoraptorVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} + *//*?}*/ @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/InostranceviaEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/InostranceviaEntity.java index 95f740f..33c42f6 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/InostranceviaEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/InostranceviaEntity.java @@ -54,10 +54,18 @@ import software.bernie.geckolib.animation.*; public class InostranceviaEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(InostranceviaEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(InostranceviaEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 33600; + private static final float MIN_ANIMAL_SCALE = 0.9F; + private static final float MAX_ANIMAL_SCALE = 1.3F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(InostranceviaEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(InostranceviaEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(InostranceviaEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -106,10 +114,14 @@ public class InostranceviaEntity extends DinoEntityBase implements GeoEntity { return ModBlocks.INCUBATED_INOSTRANCEVIA_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -123,16 +135,17 @@ public class InostranceviaEntity extends DinoEntityBase implements GeoEntity { } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.INOSTRANCEVIA.get().create(pLevel); - if (child instanceof InostranceviaEntity baby) { - InostranceviaVariant randomVariant = Util.getRandom(InostranceviaVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.INOSTRANCEVIA.get().create(pLevel); + if (child instanceof InostranceviaEntity baby) { + InostranceviaVariant randomVariant = Util.getRandom(InostranceviaVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -183,11 +196,13 @@ public class InostranceviaEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -252,6 +267,7 @@ public class InostranceviaEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -259,12 +275,55 @@ public class InostranceviaEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -283,33 +342,35 @@ public class InostranceviaEntity extends DinoEntityBase implements GeoEntity { if (!(other instanceof InostranceviaEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - /*? if <=1.20.1 {*/ - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { - InostranceviaVariant variant = Util.getRandom(InostranceviaVariant.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) { - InostranceviaVariant variant = Util.getRandom(InostranceviaVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } - *//*?}*/ + /*? if <=1.20.1 {*/ + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + InostranceviaVariant variant = Util.getRandom(InostranceviaVariant.values(), this.random); + this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); + return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); + } + /*?} else {*/ + /*@Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + InostranceviaVariant variant = Util.getRandom(InostranceviaVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} + *//*?}*/ @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/LambeosaurusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/LambeosaurusEntity.java index 231c3ad..399038c 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/LambeosaurusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/LambeosaurusEntity.java @@ -51,10 +51,18 @@ import software.bernie.geckolib.animation.*; public class LambeosaurusEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(LambeosaurusEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(LambeosaurusEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 52800; + private static final float MIN_ANIMAL_SCALE = 1.6F; + private static final float MAX_ANIMAL_SCALE = 2.0F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(LambeosaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(LambeosaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(LambeosaurusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -103,10 +111,14 @@ public class LambeosaurusEntity extends DinoEntityBase implements GeoEntity { return ModBlocks.INCUBATED_LAMBEOSAURUS_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -120,16 +132,17 @@ public class LambeosaurusEntity extends DinoEntityBase implements GeoEntity { } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.LAMBEOSAURUS.get().create(pLevel); - if (child instanceof LambeosaurusEntity baby) { - LambeosaurusVariant randomVariant = Util.getRandom(LambeosaurusVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.LAMBEOSAURUS.get().create(pLevel); + if (child instanceof LambeosaurusEntity baby) { + LambeosaurusVariant randomVariant = Util.getRandom(LambeosaurusVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -179,11 +192,13 @@ public class LambeosaurusEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -248,6 +263,7 @@ public class LambeosaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -255,12 +271,55 @@ public class LambeosaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -279,33 +338,35 @@ public class LambeosaurusEntity extends DinoEntityBase implements GeoEntity { if (!(other instanceof LambeosaurusEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - /*? if <=1.20.1 {*/ - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { - LambeosaurusVariant variant = Util.getRandom(LambeosaurusVariant.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) { - LambeosaurusVariant variant = Util.getRandom(LambeosaurusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } - *//*?}*/ + /*? if <=1.20.1 {*/ + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + LambeosaurusVariant variant = Util.getRandom(LambeosaurusVariant.values(), this.random); + this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); + return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); + } + /*?} else {*/ + /*@Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + LambeosaurusVariant variant = Util.getRandom(LambeosaurusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} + *//*?}*/ @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/LudodactylusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/LudodactylusEntity.java index 2e6c312..f6b90a5 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/LudodactylusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/LudodactylusEntity.java @@ -63,10 +63,18 @@ import software.bernie.geckolib.animation.*; public class LudodactylusEntity extends DinoEntityBase implements GeoEntity, FlyingAnimal { private final AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(LudodactylusEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(LudodactylusEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 24000; + private static final float MIN_ANIMAL_SCALE = 1.3F; + private static final float MAX_ANIMAL_SCALE = 1.7F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(LudodactylusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(LudodactylusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(LudodactylusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -116,10 +124,14 @@ public class LudodactylusEntity extends DinoEntityBase implements GeoEntity, Fly return ModBlocks.INCUBATED_LUDODACTYLUS_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -157,16 +169,17 @@ public class LudodactylusEntity extends DinoEntityBase implements GeoEntity, Fly } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.LUDODACTYLUS.get().create(pLevel); - if (child instanceof LudodactylusEntity baby) { - LudodactylusVariant randomVariant = Util.getRandom(LudodactylusVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.LUDODACTYLUS.get().create(pLevel); + if (child instanceof LudodactylusEntity baby) { + LudodactylusVariant randomVariant = Util.getRandom(LudodactylusVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -221,11 +234,13 @@ public class LudodactylusEntity extends DinoEntityBase implements GeoEntity, Fly double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -290,6 +305,7 @@ public class LudodactylusEntity extends DinoEntityBase implements GeoEntity, Fly super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -297,12 +313,55 @@ public class LudodactylusEntity extends DinoEntityBase implements GeoEntity, Fly super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public LudodactylusVariant getVariant() { return LudodactylusVariant.byId(this.getTypeVariant() & 255); @@ -327,28 +386,30 @@ public class LudodactylusEntity extends DinoEntityBase implements GeoEntity, Fly public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { LudodactylusVariant variant = Util.getRandom(LudodactylusVariant.values(), this.random); this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); } /*?} else {*/ /*@Override public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { - LudodactylusVariant variant = Util.getRandom(LudodactylusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } + LudodactylusVariant variant = Util.getRandom(LudodactylusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} *//*?}*/ - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - @Override - public void addAdditionalSaveData(CompoundTag pCompound) { - super.addAdditionalSaveData(pCompound); - pCompound.putInt("Variant", this.getTypeVariant()); - } + @Override + public void addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/MajungasaurusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/MajungasaurusEntity.java index 1710f0a..a4bf11e 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/MajungasaurusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/MajungasaurusEntity.java @@ -55,10 +55,18 @@ import software.bernie.geckolib.animation.*; public class MajungasaurusEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(MajungasaurusEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(MajungasaurusEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 43200; + private static final float MIN_ANIMAL_SCALE = 1.2F; + private static final float MAX_ANIMAL_SCALE = 1.6F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(MajungasaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(MajungasaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(MajungasaurusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -107,10 +115,14 @@ public class MajungasaurusEntity extends DinoEntityBase implements GeoEntity { return ModBlocks.INCUBATED_MAJUNGASAURUS_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -124,16 +136,17 @@ public class MajungasaurusEntity extends DinoEntityBase implements GeoEntity { } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.MAJUNGASAURUS.get().create(pLevel); - if (child instanceof MajungasaurusEntity baby) { - MajungasaurusVariant randomVariant = Util.getRandom(MajungasaurusVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.MAJUNGASAURUS.get().create(pLevel); + if (child instanceof MajungasaurusEntity baby) { + MajungasaurusVariant randomVariant = Util.getRandom(MajungasaurusVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -184,11 +197,13 @@ public class MajungasaurusEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -253,6 +268,7 @@ public class MajungasaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -260,12 +276,55 @@ public class MajungasaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -284,33 +343,35 @@ public class MajungasaurusEntity extends DinoEntityBase implements GeoEntity { if (!(other instanceof MajungasaurusEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - /*? if <=1.20.1 {*/ - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { - MajungasaurusVariant variant = Util.getRandom(MajungasaurusVariant.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) { - MajungasaurusVariant variant = Util.getRandom(MajungasaurusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } - *//*?}*/ + /*? if <=1.20.1 {*/ + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + MajungasaurusVariant variant = Util.getRandom(MajungasaurusVariant.values(), this.random); + this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); + return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); + } + /*?} else {*/ + /*@Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + MajungasaurusVariant variant = Util.getRandom(MajungasaurusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} + *//*?}*/ @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/MamenchisaurusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/MamenchisaurusEntity.java index 07e6f6e..2b00936 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/MamenchisaurusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/MamenchisaurusEntity.java @@ -55,10 +55,18 @@ import software.bernie.geckolib.animation.*; public class MamenchisaurusEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(MamenchisaurusEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(MamenchisaurusEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 134400; + private static final float MIN_ANIMAL_SCALE = 1.5F; + private static final float MAX_ANIMAL_SCALE = 1.9F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(MamenchisaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(MamenchisaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(MamenchisaurusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -107,10 +115,14 @@ public class MamenchisaurusEntity extends DinoEntityBase implements GeoEntity { return ModBlocks.INCUBATED_MAMENCHISAURUS_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -124,16 +136,17 @@ public class MamenchisaurusEntity extends DinoEntityBase implements GeoEntity { } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.MAMENCHISAURUS.get().create(pLevel); - if (child instanceof MamenchisaurusEntity baby) { - MamenchisaurusVariant randomVariant = Util.getRandom(MamenchisaurusVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.MAMENCHISAURUS.get().create(pLevel); + if (child instanceof MamenchisaurusEntity baby) { + MamenchisaurusVariant randomVariant = Util.getRandom(MamenchisaurusVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -185,11 +198,13 @@ public class MamenchisaurusEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -254,6 +269,7 @@ public class MamenchisaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -261,12 +277,55 @@ public class MamenchisaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -285,33 +344,35 @@ public class MamenchisaurusEntity extends DinoEntityBase implements GeoEntity { if (!(other instanceof MamenchisaurusEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - /*? if <=1.20.1 {*/ - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { - MamenchisaurusVariant variant = Util.getRandom(MamenchisaurusVariant.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) { - MamenchisaurusVariant variant = Util.getRandom(MamenchisaurusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } - *//*?}*/ + /*? if <=1.20.1 {*/ + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + MamenchisaurusVariant variant = Util.getRandom(MamenchisaurusVariant.values(), this.random); + this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); + return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); + } + /*?} else {*/ + /*@Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + MamenchisaurusVariant variant = Util.getRandom(MamenchisaurusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} + *//*?}*/ @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/MetriacanthosaurusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/MetriacanthosaurusEntity.java index e203ddb..e56b2f7 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/MetriacanthosaurusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/MetriacanthosaurusEntity.java @@ -50,10 +50,18 @@ import software.bernie.geckolib.animation.*; public class MetriacanthosaurusEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); + public static final int BABY_TO_ADULT_AGE_TICKS = 52800; + private static final float MIN_ANIMAL_SCALE = 1.3F; + private static final float MAX_ANIMAL_SCALE = 1.7F; + + private float lastDimensionsScale = 1.0F; + private static final EntityDataAccessor VARIANT = SynchedEntityData.defineId(MetriacanthosaurusEntity.class, EntityDataSerializers.INT); private static final EntityDataAccessor DATA_SYNCED_AGE = SynchedEntityData.defineId(MetriacanthosaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(MetriacanthosaurusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -107,6 +115,10 @@ public class MetriacanthosaurusEntity extends DinoEntityBase implements GeoEntit return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); } + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } + public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() .add(Attributes.MAX_HEALTH, 45D) @@ -125,6 +137,7 @@ public class MetriacanthosaurusEntity extends DinoEntityBase implements GeoEntit if (child instanceof MetriacanthosaurusEntity baby) { MetriacanthosaurusVariant randomVariant = Util.getRandom(MetriacanthosaurusVariant.values(), this.random); baby.setVariant(randomVariant); + baby.setBaby(true); } return child; } @@ -182,6 +195,8 @@ public class MetriacanthosaurusEntity extends DinoEntityBase implements GeoEntit } } + updateDynamicDimensions(); + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; @@ -247,20 +262,59 @@ public class MetriacanthosaurusEntity extends DinoEntityBase implements GeoEntit super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { - super.defineSynchedData(pBuilder); - pBuilder.define(VARIANT, 0); - pBuilder.define(DATA_SYNCED_AGE, 0); - } + super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); pBuilder.define(DATA_ANIMAL_SCALE, 1.0F);} *//*?}*/ public int getSyncedAge() { return this.entityData.get(DATA_SYNCED_AGE); } + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale());} + *//*?}*/ + public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -283,12 +337,16 @@ public class MetriacanthosaurusEntity extends DinoEntityBase implements GeoEntit public void addAdditionalSaveData(CompoundTag pCompound) { super.addAdditionalSaveData(pCompound); pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); } @Override public void readAdditionalSaveData(CompoundTag pCompound) { super.readAdditionalSaveData(pCompound); this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } } /*? if <=1.20.1 {*/ @@ -296,15 +354,13 @@ public class MetriacanthosaurusEntity extends DinoEntityBase implements GeoEntit public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { MetriacanthosaurusVariant variant = Util.getRandom(MetriacanthosaurusVariant.values(), this.random); this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); } /*?} else {*/ /*@Override public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { - MetriacanthosaurusVariant variant = Util.getRandom(MetriacanthosaurusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } + MetriacanthosaurusVariant variant = Util.getRandom(MetriacanthosaurusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} *//*?}*/ @Override diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/MoganopterusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/MoganopterusEntity.java index bbb680a..a06202f 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/MoganopterusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/MoganopterusEntity.java @@ -63,10 +63,18 @@ import software.bernie.geckolib.animation.*; public class MoganopterusEntity extends DinoEntityBase implements GeoEntity, FlyingAnimal { private final AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); + public static final int BABY_TO_ADULT_AGE_TICKS = 33600; + private static final float MIN_ANIMAL_SCALE = 0.6F; + private static final float MAX_ANIMAL_SCALE = 1.0F; + + private float lastDimensionsScale = 1.0F; + private static final EntityDataAccessor VARIANT = SynchedEntityData.defineId(MoganopterusEntity.class, EntityDataSerializers.INT); private static final EntityDataAccessor DATA_SYNCED_AGE = SynchedEntityData.defineId(MoganopterusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(MoganopterusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -116,10 +124,14 @@ public class MoganopterusEntity extends DinoEntityBase implements GeoEntity, Fly return ModBlocks.INCUBATED_MOGANOPTERUS_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -164,6 +176,7 @@ public class MoganopterusEntity extends DinoEntityBase implements GeoEntity, Fly if (child instanceof MoganopterusEntity baby) { MoganopterusVariant randomVariant = Util.getRandom(MoganopterusVariant.values(), this.random); baby.setVariant(randomVariant); + baby.setBaby(true); } return child; } @@ -225,6 +238,8 @@ public class MoganopterusEntity extends DinoEntityBase implements GeoEntity, Fly } } + updateDynamicDimensions(); + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; @@ -290,19 +305,58 @@ public class MoganopterusEntity extends DinoEntityBase implements GeoEntity, Fly super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { - super.defineSynchedData(pBuilder); - pBuilder.define(VARIANT, 0); - pBuilder.define(DATA_SYNCED_AGE, 0); - } + super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); pBuilder.define(DATA_ANIMAL_SCALE, 1.0F);} *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale());} + *//*?}*/ public MoganopterusVariant getVariant() { return MoganopterusVariant.byId(this.getTypeVariant() & 255); @@ -327,27 +381,29 @@ public class MoganopterusEntity extends DinoEntityBase implements GeoEntity, Fly public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { MoganopterusVariant variant = Util.getRandom(MoganopterusVariant.values(), this.random); this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); } /*?} else {*/ /*@Override public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { - MoganopterusVariant variant = Util.getRandom(MoganopterusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } + MoganopterusVariant variant = Util.getRandom(MoganopterusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} *//*?}*/ @Override public void readAdditionalSaveData(CompoundTag pCompound) { super.readAdditionalSaveData(pCompound); this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } } @Override public void addAdditionalSaveData(CompoundTag pCompound) { super.addAdditionalSaveData(pCompound); pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); } @Override diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/MussasaurusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/MussasaurusEntity.java index ebd3832..b4c719a 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/MussasaurusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/MussasaurusEntity.java @@ -46,10 +46,18 @@ import software.bernie.geckolib.animation.*; public class MussasaurusEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); + public static final int BABY_TO_ADULT_AGE_TICKS = 62400; + private static final float MIN_ANIMAL_SCALE = 0.5F; + private static final float MAX_ANIMAL_SCALE = 0.9F; + + private float lastDimensionsScale = 1.0F; + private static final EntityDataAccessor VARIANT = SynchedEntityData.defineId(MussasaurusEntity.class, EntityDataSerializers.INT); private static final EntityDataAccessor DATA_SYNCED_AGE = SynchedEntityData.defineId(MussasaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(MussasaurusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -98,10 +106,14 @@ public class MussasaurusEntity extends DinoEntityBase implements GeoEntity { return ModBlocks.INCUBATED_MUSSASAURUS_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -122,6 +134,7 @@ public class MussasaurusEntity extends DinoEntityBase implements GeoEntity { if (child instanceof MussasaurusEntity baby) { MussasaurusVariant randomVariant = Util.getRandom(MussasaurusVariant.values(), this.random); baby.setVariant(randomVariant); + baby.setBaby(true); } return child; } @@ -178,6 +191,8 @@ public class MussasaurusEntity extends DinoEntityBase implements GeoEntity { } } + updateDynamicDimensions(); + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; @@ -243,19 +258,58 @@ public class MussasaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { - super.defineSynchedData(pBuilder); - pBuilder.define(VARIANT, 0); - pBuilder.define(DATA_SYNCED_AGE, 0); - } + super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); pBuilder.define(DATA_ANIMAL_SCALE, 1.0F);} *//*?}*/ public int getSyncedAge() { return this.entityData.get(DATA_SYNCED_AGE); } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale());} + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -278,12 +332,16 @@ public class MussasaurusEntity extends DinoEntityBase implements GeoEntity { public void addAdditionalSaveData(CompoundTag pCompound) { super.addAdditionalSaveData(pCompound); pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); } @Override public void readAdditionalSaveData(CompoundTag pCompound) { super.readAdditionalSaveData(pCompound); this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } } /*? if <=1.20.1 {*/ @@ -291,15 +349,13 @@ public class MussasaurusEntity extends DinoEntityBase implements GeoEntity { public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { MussasaurusVariant variant = Util.getRandom(MussasaurusVariant.values(), this.random); this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); } /*?} else {*/ /*@Override public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { - MussasaurusVariant variant = Util.getRandom(MussasaurusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } + MussasaurusVariant variant = Util.getRandom(MussasaurusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} *//*?}*/ @Override diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/NyctosaurusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/NyctosaurusEntity.java index 449b5d0..9aeffd0 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/NyctosaurusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/NyctosaurusEntity.java @@ -63,10 +63,18 @@ import software.bernie.geckolib.animation.*; public class NyctosaurusEntity extends DinoEntityBase implements GeoEntity, FlyingAnimal { private final AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); + public static final int BABY_TO_ADULT_AGE_TICKS = 24000; + private static final float MIN_ANIMAL_SCALE = 0.1F; + private static final float MAX_ANIMAL_SCALE = 0.5F; + + private float lastDimensionsScale = 1.0F; + private static final EntityDataAccessor VARIANT = SynchedEntityData.defineId(NyctosaurusEntity.class, EntityDataSerializers.INT); private static final EntityDataAccessor DATA_SYNCED_AGE = SynchedEntityData.defineId(NyctosaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(NyctosaurusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -116,10 +124,14 @@ public class NyctosaurusEntity extends DinoEntityBase implements GeoEntity, Flyi return ModBlocks.INCUBATED_NYCTOSAURUS_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -164,6 +176,7 @@ public class NyctosaurusEntity extends DinoEntityBase implements GeoEntity, Flyi if (child instanceof NyctosaurusEntity baby) { NyctosaurusVariant randomVariant = Util.getRandom(NyctosaurusVariant.values(), this.random); baby.setVariant(randomVariant); + baby.setBaby(true); } return child; } @@ -221,10 +234,12 @@ public class NyctosaurusEntity extends DinoEntityBase implements GeoEntity, Flyi double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } + } } } + updateDynamicDimensions(); + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; @@ -290,20 +305,59 @@ public class NyctosaurusEntity extends DinoEntityBase implements GeoEntity, Flyi super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { - super.defineSynchedData(pBuilder); - pBuilder.define(VARIANT, 0); - pBuilder.define(DATA_SYNCED_AGE, 0); - } + super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); pBuilder.define(DATA_ANIMAL_SCALE, 1.0F);} *//*?}*/ public int getSyncedAge() { return this.entityData.get(DATA_SYNCED_AGE); } + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale());} + *//*?}*/ + public NyctosaurusVariant getVariant() { return NyctosaurusVariant.byId(this.getTypeVariant() & 255); } @@ -327,27 +381,29 @@ public class NyctosaurusEntity extends DinoEntityBase implements GeoEntity, Flyi public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { NyctosaurusVariant variant = Util.getRandom(NyctosaurusVariant.values(), this.random); this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); } /*?} else {*/ /*@Override public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { - NyctosaurusVariant variant = Util.getRandom(NyctosaurusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } + NyctosaurusVariant variant = Util.getRandom(NyctosaurusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} *//*?}*/ @Override public void readAdditionalSaveData(CompoundTag pCompound) { super.readAdditionalSaveData(pCompound); this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } } @Override public void addAdditionalSaveData(CompoundTag pCompound) { super.addAdditionalSaveData(pCompound); pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); } @Override diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/OrnitholestesEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/OrnitholestesEntity.java index da35134..d7af625 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/OrnitholestesEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/OrnitholestesEntity.java @@ -54,10 +54,18 @@ import software.bernie.geckolib.animation.*; public class OrnitholestesEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(OrnitholestesEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(OrnitholestesEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 24000; + private static final float MIN_ANIMAL_SCALE = 0.4F; + private static final float MAX_ANIMAL_SCALE = 0.8F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(OrnitholestesEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(OrnitholestesEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(OrnitholestesEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -106,10 +114,14 @@ public class OrnitholestesEntity extends DinoEntityBase implements GeoEntity { return ModBlocks.INCUBATED_ORNITHOLESTES_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -123,16 +135,17 @@ public class OrnitholestesEntity extends DinoEntityBase implements GeoEntity { } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.ORNITHOLESTES.get().create(pLevel); - if (child instanceof OrnitholestesEntity baby) { - OrnitholestesVariant randomVariant = Util.getRandom(OrnitholestesVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.ORNITHOLESTES.get().create(pLevel); + if (child instanceof OrnitholestesEntity baby) { + OrnitholestesVariant randomVariant = Util.getRandom(OrnitholestesVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -182,11 +195,13 @@ public class OrnitholestesEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -251,6 +266,7 @@ public class OrnitholestesEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -258,12 +274,55 @@ public class OrnitholestesEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -282,33 +341,35 @@ public class OrnitholestesEntity extends DinoEntityBase implements GeoEntity { if (!(other instanceof OrnitholestesEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - /*? if <=1.20.1 {*/ - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { - OrnitholestesVariant variant = Util.getRandom(OrnitholestesVariant.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) { - OrnitholestesVariant variant = Util.getRandom(OrnitholestesVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } - *//*?}*/ + /*? if <=1.20.1 {*/ + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + OrnitholestesVariant variant = Util.getRandom(OrnitholestesVariant.values(), this.random); + this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); + return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); + } + /*?} else {*/ + /*@Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + OrnitholestesVariant variant = Util.getRandom(OrnitholestesVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} + *//*?}*/ @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/OrnithomimusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/OrnithomimusEntity.java index 3a8d50c..1417e0e 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/OrnithomimusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/OrnithomimusEntity.java @@ -51,10 +51,18 @@ import software.bernie.geckolib.animation.*; public class OrnithomimusEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(OrnithomimusEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(OrnithomimusEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 33600; + private static final float MIN_ANIMAL_SCALE = 0.8F; + private static final float MAX_ANIMAL_SCALE = 1.2F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(OrnithomimusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(OrnithomimusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(OrnithomimusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -103,10 +111,14 @@ public class OrnithomimusEntity extends DinoEntityBase implements GeoEntity { return ModBlocks.INCUBATED_ORNITHOMIMUS_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -120,16 +132,17 @@ public class OrnithomimusEntity extends DinoEntityBase implements GeoEntity { } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.ORNITHOMIMUS.get().create(pLevel); - if (child instanceof OrnithomimusEntity baby) { - OrnithomimusVariant randomVariant = Util.getRandom(OrnithomimusVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.ORNITHOMIMUS.get().create(pLevel); + if (child instanceof OrnithomimusEntity baby) { + OrnithomimusVariant randomVariant = Util.getRandom(OrnithomimusVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -179,11 +192,13 @@ public class OrnithomimusEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -248,6 +263,7 @@ public class OrnithomimusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -255,12 +271,55 @@ public class OrnithomimusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -279,33 +338,35 @@ public class OrnithomimusEntity extends DinoEntityBase implements GeoEntity { if (!(other instanceof OrnithomimusEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - /*? if <=1.20.1 {*/ - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { - OrnithomimusVariant variant = Util.getRandom(OrnithomimusVariant.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) { - OrnithomimusVariant variant = Util.getRandom(OrnithomimusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } - *//*?}*/ + /*? if <=1.20.1 {*/ + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + OrnithomimusVariant variant = Util.getRandom(OrnithomimusVariant.values(), this.random); + this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); + return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); + } + /*?} else {*/ + /*@Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + OrnithomimusVariant variant = Util.getRandom(OrnithomimusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} + *//*?}*/ @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/OuranosaurusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/OuranosaurusEntity.java index 4af5662..80ddaea 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/OuranosaurusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/OuranosaurusEntity.java @@ -51,10 +51,18 @@ import software.bernie.geckolib.animation.*; public class OuranosaurusEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(OuranosaurusEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(OuranosaurusEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 52800; + private static final float MIN_ANIMAL_SCALE = 1.2F; + private static final float MAX_ANIMAL_SCALE = 1.6F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(OuranosaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(OuranosaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(OuranosaurusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -103,10 +111,14 @@ public class OuranosaurusEntity extends DinoEntityBase implements GeoEntity { return ModBlocks.INCUBATED_OURANOSAURUS_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -120,16 +132,17 @@ public class OuranosaurusEntity extends DinoEntityBase implements GeoEntity { } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.OURANOSAURUS.get().create(pLevel); - if (child instanceof OuranosaurusEntity baby) { - OuranosaurusVariant randomVariant = Util.getRandom(OuranosaurusVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.OURANOSAURUS.get().create(pLevel); + if (child instanceof OuranosaurusEntity baby) { + OuranosaurusVariant randomVariant = Util.getRandom(OuranosaurusVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -179,11 +192,13 @@ public class OuranosaurusEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -248,6 +263,7 @@ public class OuranosaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -255,12 +271,55 @@ public class OuranosaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -279,33 +338,35 @@ public class OuranosaurusEntity extends DinoEntityBase implements GeoEntity { if (!(other instanceof OuranosaurusEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - /*? if <=1.20.1 {*/ - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { - OuranosaurusVariant variant = Util.getRandom(OuranosaurusVariant.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) { - OuranosaurusVariant variant = Util.getRandom(OuranosaurusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } - *//*?}*/ + /*? if <=1.20.1 {*/ + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + OuranosaurusVariant variant = Util.getRandom(OuranosaurusVariant.values(), this.random); + this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); + return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); + } + /*?} else {*/ + /*@Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + OuranosaurusVariant variant = Util.getRandom(OuranosaurusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} + *//*?}*/ @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/OviraptorEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/OviraptorEntity.java index 1df5cd2..b27f265 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/OviraptorEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/OviraptorEntity.java @@ -53,10 +53,18 @@ import software.bernie.geckolib.animation.*; public class OviraptorEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(OviraptorEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(OviraptorEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 28800; + private static final float MIN_ANIMAL_SCALE = 0.35F; + private static final float MAX_ANIMAL_SCALE = 0.75F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(OviraptorEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(OviraptorEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(OviraptorEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -105,10 +113,14 @@ public class OviraptorEntity extends DinoEntityBase implements GeoEntity { return ModBlocks.INCUBATED_OVIRAPTOR_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -122,16 +134,17 @@ public class OviraptorEntity extends DinoEntityBase implements GeoEntity { } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.OVIRAPTOR.get().create(pLevel); - if (child instanceof OviraptorEntity baby) { - OviraptorVariant randomVariant = Util.getRandom(OviraptorVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.OVIRAPTOR.get().create(pLevel); + if (child instanceof OviraptorEntity baby) { + OviraptorVariant randomVariant = Util.getRandom(OviraptorVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -181,11 +194,13 @@ public class OviraptorEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -250,6 +265,7 @@ public class OviraptorEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -257,12 +273,55 @@ public class OviraptorEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -281,33 +340,35 @@ public class OviraptorEntity extends DinoEntityBase implements GeoEntity { if (!(other instanceof OviraptorEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - /*? if <=1.20.1 {*/ - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { - OviraptorVariant variant = Util.getRandom(OviraptorVariant.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) { - OviraptorVariant variant = Util.getRandom(OviraptorVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } - *//*?}*/ + /*? if <=1.20.1 {*/ + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + OviraptorVariant variant = Util.getRandom(OviraptorVariant.values(), this.random); + this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); + return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); + } + /*?} else {*/ + /*@Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + OviraptorVariant variant = Util.getRandom(OviraptorVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} + *//*?}*/ @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/PachycephalosaurusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/PachycephalosaurusEntity.java index d191908..e8c6797 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/PachycephalosaurusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/PachycephalosaurusEntity.java @@ -53,10 +53,18 @@ import software.bernie.geckolib.animation.*; public class PachycephalosaurusEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(PachycephalosaurusEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(PachycephalosaurusEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 52800; + private static final float MIN_ANIMAL_SCALE = 0.6F; + private static final float MAX_ANIMAL_SCALE = 1.0F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(PachycephalosaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(PachycephalosaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(PachycephalosaurusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -105,10 +113,14 @@ public class PachycephalosaurusEntity extends DinoEntityBase implements GeoEntit return ModBlocks.INCUBATED_PACHYCEPHALOSAURUS_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -122,16 +134,17 @@ public class PachycephalosaurusEntity extends DinoEntityBase implements GeoEntit } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.PACHYCEPHALOSAURUS.get().create(pLevel); - if (child instanceof PachycephalosaurusEntity baby) { - PachycephalosaurusVariant randomVariant = Util.getRandom(PachycephalosaurusVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.PACHYCEPHALOSAURUS.get().create(pLevel); + if (child instanceof PachycephalosaurusEntity baby) { + PachycephalosaurusVariant randomVariant = Util.getRandom(PachycephalosaurusVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -181,11 +194,13 @@ public class PachycephalosaurusEntity extends DinoEntityBase implements GeoEntit double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -250,6 +265,7 @@ public class PachycephalosaurusEntity extends DinoEntityBase implements GeoEntit super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -257,12 +273,55 @@ public class PachycephalosaurusEntity extends DinoEntityBase implements GeoEntit super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -281,33 +340,35 @@ public class PachycephalosaurusEntity extends DinoEntityBase implements GeoEntit if (!(other instanceof PachycephalosaurusEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - /*? if <=1.20.1 {*/ - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { - PachycephalosaurusVariant variant = Util.getRandom(PachycephalosaurusVariant.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) { - PachycephalosaurusVariant variant = Util.getRandom(PachycephalosaurusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } - *//*?}*/ + /*? if <=1.20.1 {*/ + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + PachycephalosaurusVariant variant = Util.getRandom(PachycephalosaurusVariant.values(), this.random); + this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); + return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); + } + /*?} else {*/ + /*@Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + PachycephalosaurusVariant variant = Util.getRandom(PachycephalosaurusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} + *//*?}*/ @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ParasaurolophusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ParasaurolophusEntity.java index a09c039..27f0527 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ParasaurolophusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ParasaurolophusEntity.java @@ -51,10 +51,18 @@ import software.bernie.geckolib.animation.*; public class ParasaurolophusEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(ParasaurolophusEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(ParasaurolophusEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 57600; + private static final float MIN_ANIMAL_SCALE = 1.5F; + private static final float MAX_ANIMAL_SCALE = 1.9F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(ParasaurolophusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(ParasaurolophusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(ParasaurolophusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -103,10 +111,14 @@ public class ParasaurolophusEntity extends DinoEntityBase implements GeoEntity { return ModBlocks.INCUBATED_PARASAUROLOPHUS_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -120,16 +132,17 @@ public class ParasaurolophusEntity extends DinoEntityBase implements GeoEntity { } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.PARASAUROLOPHUS.get().create(pLevel); - if (child instanceof ParasaurolophusEntity baby) { - ParasaurolophusVariant randomVariant = Util.getRandom(ParasaurolophusVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.PARASAUROLOPHUS.get().create(pLevel); + if (child instanceof ParasaurolophusEntity baby) { + ParasaurolophusVariant randomVariant = Util.getRandom(ParasaurolophusVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -179,11 +192,13 @@ public class ParasaurolophusEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -248,6 +263,7 @@ public class ParasaurolophusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -255,12 +271,55 @@ public class ParasaurolophusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -279,33 +338,35 @@ public class ParasaurolophusEntity extends DinoEntityBase implements GeoEntity { if (!(other instanceof ParasaurolophusEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - /*? if <=1.20.1 {*/ - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { - ParasaurolophusVariant variant = Util.getRandom(ParasaurolophusVariant.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) { - ParasaurolophusVariant variant = Util.getRandom(ParasaurolophusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } - *//*?}*/ + /*? if <=1.20.1 {*/ + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + ParasaurolophusVariant variant = Util.getRandom(ParasaurolophusVariant.values(), this.random); + this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); + return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); + } + /*?} else {*/ + /*@Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + ParasaurolophusVariant variant = Util.getRandom(ParasaurolophusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} + *//*?}*/ @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ProceratosaurusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ProceratosaurusEntity.java index 4d8c999..3e24d86 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ProceratosaurusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ProceratosaurusEntity.java @@ -54,10 +54,18 @@ import software.bernie.geckolib.animation.*; public class ProceratosaurusEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(ProceratosaurusEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(ProceratosaurusEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 33600; + private static final float MIN_ANIMAL_SCALE = 0.4F; + private static final float MAX_ANIMAL_SCALE = 0.8F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(ProceratosaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(ProceratosaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(ProceratosaurusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -106,10 +114,14 @@ public class ProceratosaurusEntity extends DinoEntityBase implements GeoEntity { return ModBlocks.INCUBATED_PROCERATOSAURUS_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -123,16 +135,17 @@ public class ProceratosaurusEntity extends DinoEntityBase implements GeoEntity { } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.PROCERATOSAURUS.get().create(pLevel); - if (child instanceof ProceratosaurusEntity baby) { - ProceratosaurusVariant randomVariant = Util.getRandom(ProceratosaurusVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.PROCERATOSAURUS.get().create(pLevel); + if (child instanceof ProceratosaurusEntity baby) { + ProceratosaurusVariant randomVariant = Util.getRandom(ProceratosaurusVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -182,11 +195,13 @@ public class ProceratosaurusEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -251,6 +266,7 @@ public class ProceratosaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -258,12 +274,55 @@ public class ProceratosaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -282,33 +341,35 @@ public class ProceratosaurusEntity extends DinoEntityBase implements GeoEntity { if (!(other instanceof ProceratosaurusEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - /*? if <=1.20.1 {*/ - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { - ProceratosaurusVariant variant = Util.getRandom(ProceratosaurusVariant.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) { - ProceratosaurusVariant variant = Util.getRandom(ProceratosaurusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } - *//*?}*/ + /*? if <=1.20.1 {*/ + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + ProceratosaurusVariant variant = Util.getRandom(ProceratosaurusVariant.values(), this.random); + this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); + return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); + } + /*?} else {*/ + /*@Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + ProceratosaurusVariant variant = Util.getRandom(ProceratosaurusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} + *//*?}*/ @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ProcompsognathusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ProcompsognathusEntity.java index 657bb2f..e0ab0e4 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ProcompsognathusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ProcompsognathusEntity.java @@ -54,10 +54,18 @@ import software.bernie.geckolib.animation.*; public class ProcompsognathusEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(ProcompsognathusEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(ProcompsognathusEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 14400; + private static final float MIN_ANIMAL_SCALE = 0.0F; + private static final float MAX_ANIMAL_SCALE = 0.4F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(ProcompsognathusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(ProcompsognathusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(ProcompsognathusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -106,10 +114,14 @@ public class ProcompsognathusEntity extends DinoEntityBase implements GeoEntity return ModBlocks.INCUBATED_PROCOMPSOGNATHUS_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -123,16 +135,17 @@ public class ProcompsognathusEntity extends DinoEntityBase implements GeoEntity } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.PROCOMPSOGNATHUS.get().create(pLevel); - if (child instanceof ProcompsognathusEntity baby) { - ProcompsognathusVariant randomVariant = Util.getRandom(ProcompsognathusVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.PROCOMPSOGNATHUS.get().create(pLevel); + if (child instanceof ProcompsognathusEntity baby) { + ProcompsognathusVariant randomVariant = Util.getRandom(ProcompsognathusVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -182,11 +195,13 @@ public class ProcompsognathusEntity extends DinoEntityBase implements GeoEntity double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -251,6 +266,7 @@ public class ProcompsognathusEntity extends DinoEntityBase implements GeoEntity super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -258,12 +274,55 @@ public class ProcompsognathusEntity extends DinoEntityBase implements GeoEntity super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -282,33 +341,35 @@ public class ProcompsognathusEntity extends DinoEntityBase implements GeoEntity if (!(other instanceof ProcompsognathusEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - /*? if <=1.20.1 {*/ - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { - ProcompsognathusVariant variant = Util.getRandom(ProcompsognathusVariant.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) { - ProcompsognathusVariant variant = Util.getRandom(ProcompsognathusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } - *//*?}*/ + /*? if <=1.20.1 {*/ + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + ProcompsognathusVariant variant = Util.getRandom(ProcompsognathusVariant.values(), this.random); + this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); + return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); + } + /*?} else {*/ + /*@Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + ProcompsognathusVariant variant = Util.getRandom(ProcompsognathusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} + *//*?}*/ @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ProtoceratopsEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ProtoceratopsEntity.java index fd59906..9a639cf 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ProtoceratopsEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ProtoceratopsEntity.java @@ -53,10 +53,18 @@ import software.bernie.geckolib.animation.*; public class ProtoceratopsEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(ProtoceratopsEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(ProtoceratopsEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 43200; + private static final float MIN_ANIMAL_SCALE = 1.0F; + private static final float MAX_ANIMAL_SCALE = 1.4F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(ProtoceratopsEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(ProtoceratopsEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(ProtoceratopsEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -105,10 +113,14 @@ public class ProtoceratopsEntity extends DinoEntityBase implements GeoEntity { return ModBlocks.INCUBATED_PROTOCERATOPS_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -122,16 +134,17 @@ public class ProtoceratopsEntity extends DinoEntityBase implements GeoEntity { } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.PROTOCERATOPS.get().create(pLevel); - if (child instanceof ProtoceratopsEntity baby) { - ProtoceratopsVariant randomVariant = Util.getRandom(ProtoceratopsVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.PROTOCERATOPS.get().create(pLevel); + if (child instanceof ProtoceratopsEntity baby) { + ProtoceratopsVariant randomVariant = Util.getRandom(ProtoceratopsVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -181,11 +194,13 @@ public class ProtoceratopsEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -250,6 +265,7 @@ public class ProtoceratopsEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -257,12 +273,55 @@ public class ProtoceratopsEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -281,33 +340,35 @@ public class ProtoceratopsEntity extends DinoEntityBase implements GeoEntity { if (!(other instanceof ProtoceratopsEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - /*? if <=1.20.1 {*/ - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { - ProtoceratopsVariant variant = Util.getRandom(ProtoceratopsVariant.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) { - ProtoceratopsVariant variant = Util.getRandom(ProtoceratopsVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } - *//*?}*/ + /*? if <=1.20.1 {*/ + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + ProtoceratopsVariant variant = Util.getRandom(ProtoceratopsVariant.values(), this.random); + this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); + return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); + } + /*?} else {*/ + /*@Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + ProtoceratopsVariant variant = Util.getRandom(ProtoceratopsVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} + *//*?}*/ @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/PteranodonEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/PteranodonEntity.java index c37b43d..d5109b7 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/PteranodonEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/PteranodonEntity.java @@ -63,10 +63,18 @@ import software.bernie.geckolib.animation.*; public class PteranodonEntity extends DinoEntityBase implements GeoEntity, FlyingAnimal { private final AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(PteranodonEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(PteranodonEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 28800; + private static final float MIN_ANIMAL_SCALE = 1.3F; + private static final float MAX_ANIMAL_SCALE = 1.7F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(PteranodonEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(PteranodonEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(PteranodonEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -116,10 +124,14 @@ public class PteranodonEntity extends DinoEntityBase implements GeoEntity, Flyin return ModBlocks.INCUBATED_PTERANODON_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -157,16 +169,17 @@ public class PteranodonEntity extends DinoEntityBase implements GeoEntity, Flyin } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.PTERANODON.get().create(pLevel); - if (child instanceof PteranodonEntity baby) { - PteranodonVariant randomVariant = Util.getRandom(PteranodonVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.PTERANODON.get().create(pLevel); + if (child instanceof PteranodonEntity baby) { + PteranodonVariant randomVariant = Util.getRandom(PteranodonVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -221,11 +234,13 @@ public class PteranodonEntity extends DinoEntityBase implements GeoEntity, Flyin double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -290,6 +305,7 @@ public class PteranodonEntity extends DinoEntityBase implements GeoEntity, Flyin super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -297,12 +313,55 @@ public class PteranodonEntity extends DinoEntityBase implements GeoEntity, Flyin super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public PteranodonVariant getVariant() { return PteranodonVariant.byId(this.getTypeVariant() & 255); @@ -327,28 +386,30 @@ public class PteranodonEntity extends DinoEntityBase implements GeoEntity, Flyin public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { PteranodonVariant variant = Util.getRandom(PteranodonVariant.values(), this.random); this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); } /*?} else {*/ /*@Override public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { - PteranodonVariant variant = Util.getRandom(PteranodonVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } + PteranodonVariant variant = Util.getRandom(PteranodonVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} *//*?}*/ - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - @Override - public void addAdditionalSaveData(CompoundTag pCompound) { - super.addAdditionalSaveData(pCompound); - pCompound.putInt("Variant", this.getTypeVariant()); - } + @Override + public void addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/PterodaustroEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/PterodaustroEntity.java index 57d1e34..fea51ba 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/PterodaustroEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/PterodaustroEntity.java @@ -63,10 +63,18 @@ import software.bernie.geckolib.animation.*; public class PterodaustroEntity extends DinoEntityBase implements GeoEntity, FlyingAnimal { private final AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(PterodaustroEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(PterodaustroEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 19200; + private static final float MIN_ANIMAL_SCALE = 0.5F; + private static final float MAX_ANIMAL_SCALE = 0.9F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(PterodaustroEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(PterodaustroEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(PterodaustroEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -116,10 +124,14 @@ public class PterodaustroEntity extends DinoEntityBase implements GeoEntity, Fly return ModBlocks.INCUBATED_PTERODAUSTRO_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -157,16 +169,17 @@ public class PterodaustroEntity extends DinoEntityBase implements GeoEntity, Fly } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.PTERODAUSTRO.get().create(pLevel); - if (child instanceof PterodaustroEntity baby) { - PterodaustroVariant randomVariant = Util.getRandom(PterodaustroVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.PTERODAUSTRO.get().create(pLevel); + if (child instanceof PterodaustroEntity baby) { + PterodaustroVariant randomVariant = Util.getRandom(PterodaustroVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -221,11 +234,13 @@ public class PterodaustroEntity extends DinoEntityBase implements GeoEntity, Fly double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -290,6 +305,7 @@ public class PterodaustroEntity extends DinoEntityBase implements GeoEntity, Fly super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -297,12 +313,55 @@ public class PterodaustroEntity extends DinoEntityBase implements GeoEntity, Fly super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public PterodaustroVariant getVariant() { return PterodaustroVariant.byId(this.getTypeVariant() & 255); @@ -327,28 +386,30 @@ public class PterodaustroEntity extends DinoEntityBase implements GeoEntity, Fly public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { PterodaustroVariant variant = Util.getRandom(PterodaustroVariant.values(), this.random); this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); } /*?} else {*/ /*@Override public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { - PterodaustroVariant variant = Util.getRandom(PterodaustroVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } + PterodaustroVariant variant = Util.getRandom(PterodaustroVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} *//*?}*/ - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - @Override - public void addAdditionalSaveData(CompoundTag pCompound) { - super.addAdditionalSaveData(pCompound); - pCompound.putInt("Variant", this.getTypeVariant()); - } + @Override + public void addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/QuetzalcoatlusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/QuetzalcoatlusEntity.java index 4ac8eca..b6951f2 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/QuetzalcoatlusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/QuetzalcoatlusEntity.java @@ -63,10 +63,18 @@ import software.bernie.geckolib.animation.*; public class QuetzalcoatlusEntity extends DinoEntityBase implements GeoEntity, FlyingAnimal { private final AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); + public static final int BABY_TO_ADULT_AGE_TICKS = 43200; + private static final float MIN_ANIMAL_SCALE = 2.3F; + private static final float MAX_ANIMAL_SCALE = 2.7F; + + private float lastDimensionsScale = 1.0F; + private static final EntityDataAccessor VARIANT = SynchedEntityData.defineId(QuetzalcoatlusEntity.class, EntityDataSerializers.INT); private static final EntityDataAccessor DATA_SYNCED_AGE = SynchedEntityData.defineId(QuetzalcoatlusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(QuetzalcoatlusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -116,10 +124,14 @@ public class QuetzalcoatlusEntity extends DinoEntityBase implements GeoEntity, F return ModBlocks.INCUBATED_QUETZALCOATLUS_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -164,6 +176,7 @@ public class QuetzalcoatlusEntity extends DinoEntityBase implements GeoEntity, F if (child instanceof QuetzalcoatlusEntity baby) { QuetzalcoatlusVariant randomVariant = Util.getRandom(QuetzalcoatlusVariant.values(), this.random); baby.setVariant(randomVariant); + baby.setBaby(true); } return child; } @@ -225,6 +238,8 @@ public class QuetzalcoatlusEntity extends DinoEntityBase implements GeoEntity, F } } + updateDynamicDimensions(); + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; @@ -290,19 +305,58 @@ public class QuetzalcoatlusEntity extends DinoEntityBase implements GeoEntity, F super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { - super.defineSynchedData(pBuilder); - pBuilder.define(VARIANT, 0); - pBuilder.define(DATA_SYNCED_AGE, 0); - } + super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); pBuilder.define(DATA_ANIMAL_SCALE, 1.0F);} *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale());} + *//*?}*/ public QuetzalcoatlusVariant getVariant() { return QuetzalcoatlusVariant.byId(this.getTypeVariant() & 255); @@ -327,27 +381,29 @@ public class QuetzalcoatlusEntity extends DinoEntityBase implements GeoEntity, F public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { QuetzalcoatlusVariant variant = Util.getRandom(QuetzalcoatlusVariant.values(), this.random); this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); } /*?} else {*/ /*@Override public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { - QuetzalcoatlusVariant variant = Util.getRandom(QuetzalcoatlusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } + QuetzalcoatlusVariant variant = Util.getRandom(QuetzalcoatlusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} *//*?}*/ @Override public void readAdditionalSaveData(CompoundTag pCompound) { super.readAdditionalSaveData(pCompound); this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } } @Override public void addAdditionalSaveData(CompoundTag pCompound) { super.addAdditionalSaveData(pCompound); pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); } @Override diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/RajasaurusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/RajasaurusEntity.java index ad4933d..45cd798 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/RajasaurusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/RajasaurusEntity.java @@ -55,10 +55,18 @@ import software.bernie.geckolib.animation.*; public class RajasaurusEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); + public static final int BABY_TO_ADULT_AGE_TICKS = 43200; + private static final float MIN_ANIMAL_SCALE = 1.0F; + private static final float MAX_ANIMAL_SCALE = 1.4F; + + private float lastDimensionsScale = 1.0F; + private static final EntityDataAccessor VARIANT = SynchedEntityData.defineId(RajasaurusEntity.class, EntityDataSerializers.INT); private static final EntityDataAccessor DATA_SYNCED_AGE = SynchedEntityData.defineId(RajasaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(RajasaurusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -107,10 +115,14 @@ public class RajasaurusEntity extends DinoEntityBase implements GeoEntity { return ModBlocks.INCUBATED_RAJASAURUS_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -131,6 +143,7 @@ public class RajasaurusEntity extends DinoEntityBase implements GeoEntity { if (child instanceof RajasaurusEntity baby) { RajasaurusVariant randomVariant = Util.getRandom(RajasaurusVariant.values(), this.random); baby.setVariant(randomVariant); + baby.setBaby(true); } return child; } @@ -184,10 +197,12 @@ public class RajasaurusEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } + } } } + updateDynamicDimensions(); + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; @@ -253,19 +268,58 @@ public class RajasaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { - super.defineSynchedData(pBuilder); - pBuilder.define(VARIANT, 0); - pBuilder.define(DATA_SYNCED_AGE, 0); - } + super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); pBuilder.define(DATA_ANIMAL_SCALE, 1.0F);} *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale());} + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -288,12 +342,16 @@ public class RajasaurusEntity extends DinoEntityBase implements GeoEntity { public void addAdditionalSaveData(CompoundTag pCompound) { super.addAdditionalSaveData(pCompound); pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); } @Override public void readAdditionalSaveData(CompoundTag pCompound) { super.readAdditionalSaveData(pCompound); this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } } /*? if <=1.20.1 {*/ @@ -301,15 +359,13 @@ public class RajasaurusEntity extends DinoEntityBase implements GeoEntity { public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { RajasaurusVariant variant = Util.getRandom(RajasaurusVariant.values(), this.random); this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); } /*?} else {*/ /*@Override public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { - RajasaurusVariant variant = Util.getRandom(RajasaurusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } + RajasaurusVariant variant = Util.getRandom(RajasaurusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} *//*?}*/ @Override diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/RugopsEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/RugopsEntity.java index 584c6f5..ce3905d 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/RugopsEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/RugopsEntity.java @@ -55,10 +55,18 @@ import software.bernie.geckolib.animation.*; public class RugopsEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); + public static final int BABY_TO_ADULT_AGE_TICKS = 38400; + private static final float MIN_ANIMAL_SCALE = 0.7F; + private static final float MAX_ANIMAL_SCALE = 1.1F; + + private float lastDimensionsScale = 1.0F; + private static final EntityDataAccessor VARIANT = SynchedEntityData.defineId(RugopsEntity.class, EntityDataSerializers.INT); private static final EntityDataAccessor DATA_SYNCED_AGE = SynchedEntityData.defineId(RugopsEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(RugopsEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -107,10 +115,14 @@ public class RugopsEntity extends DinoEntityBase implements GeoEntity { return ModBlocks.INCUBATED_RUGOPS_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -131,6 +143,7 @@ public class RugopsEntity extends DinoEntityBase implements GeoEntity { if (child instanceof RugopsEntity baby) { RugopsVariant randomVariant = Util.getRandom(RugopsVariant.values(), this.random); baby.setVariant(randomVariant); + baby.setBaby(true); } return child; } @@ -184,10 +197,12 @@ public class RugopsEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } + } } } + updateDynamicDimensions(); + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; @@ -253,19 +268,58 @@ public class RugopsEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { - super.defineSynchedData(pBuilder); - pBuilder.define(VARIANT, 0); - pBuilder.define(DATA_SYNCED_AGE, 0); - } + super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); pBuilder.define(DATA_ANIMAL_SCALE, 1.0F);} *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale());} + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -288,12 +342,16 @@ public class RugopsEntity extends DinoEntityBase implements GeoEntity { public void addAdditionalSaveData(CompoundTag pCompound) { super.addAdditionalSaveData(pCompound); pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); } @Override public void readAdditionalSaveData(CompoundTag pCompound) { super.readAdditionalSaveData(pCompound); this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } } /*? if <=1.20.1 {*/ @@ -301,15 +359,13 @@ public class RugopsEntity extends DinoEntityBase implements GeoEntity { public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { RugopsVariant variant = Util.getRandom(RugopsVariant.values(), this.random); this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); } /*?} else {*/ /*@Override public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { - RugopsVariant variant = Util.getRandom(RugopsVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } + RugopsVariant variant = Util.getRandom(RugopsVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} *//*?}*/ @Override diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/SegisaurusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/SegisaurusEntity.java index 42f2738..0b494ba 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/SegisaurusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/SegisaurusEntity.java @@ -54,10 +54,18 @@ import software.bernie.geckolib.animation.*; public class SegisaurusEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); + public static final int BABY_TO_ADULT_AGE_TICKS = 19200; + private static final float MIN_ANIMAL_SCALE = 0.2F; + private static final float MAX_ANIMAL_SCALE = 0.6F; + + private float lastDimensionsScale = 1.0F; + private static final EntityDataAccessor VARIANT = SynchedEntityData.defineId(SegisaurusEntity.class, EntityDataSerializers.INT); private static final EntityDataAccessor DATA_SYNCED_AGE = SynchedEntityData.defineId(SegisaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(SegisaurusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -106,10 +114,14 @@ public class SegisaurusEntity extends DinoEntityBase implements GeoEntity { return ModBlocks.INCUBATED_SEGISAURUS_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -130,6 +142,7 @@ public class SegisaurusEntity extends DinoEntityBase implements GeoEntity { if (child instanceof SegisaurusEntity baby) { SegisaurusVariant randomVariant = Util.getRandom(SegisaurusVariant.values(), this.random); baby.setVariant(randomVariant); + baby.setBaby(true); } return child; } @@ -186,6 +199,8 @@ public class SegisaurusEntity extends DinoEntityBase implements GeoEntity { } } + updateDynamicDimensions(); + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; @@ -251,19 +266,58 @@ public class SegisaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { - super.defineSynchedData(pBuilder); - pBuilder.define(VARIANT, 0); - pBuilder.define(DATA_SYNCED_AGE, 0); - } + super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); pBuilder.define(DATA_ANIMAL_SCALE, 1.0F);} *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale());} + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -286,12 +340,16 @@ public class SegisaurusEntity extends DinoEntityBase implements GeoEntity { public void addAdditionalSaveData(CompoundTag pCompound) { super.addAdditionalSaveData(pCompound); pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); } @Override public void readAdditionalSaveData(CompoundTag pCompound) { super.readAdditionalSaveData(pCompound); this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } } /*? if <=1.20.1 {*/ @@ -299,15 +357,13 @@ public class SegisaurusEntity extends DinoEntityBase implements GeoEntity { public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { SegisaurusVariant variant = Util.getRandom(SegisaurusVariant.values(), this.random); this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); } /*?} else {*/ /*@Override public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { - SegisaurusVariant variant = Util.getRandom(SegisaurusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } + SegisaurusVariant variant = Util.getRandom(SegisaurusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} *//*?}*/ @Override diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ShantungosaurusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ShantungosaurusEntity.java index 43bdd81..bdb0807 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ShantungosaurusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ShantungosaurusEntity.java @@ -51,10 +51,18 @@ import software.bernie.geckolib.animation.*; public class ShantungosaurusEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(ShantungosaurusEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(ShantungosaurusEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 81600; + private static final float MIN_ANIMAL_SCALE = 1.6F; + private static final float MAX_ANIMAL_SCALE = 2.0F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(ShantungosaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(ShantungosaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(ShantungosaurusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -103,10 +111,14 @@ public class ShantungosaurusEntity extends DinoEntityBase implements GeoEntity { return ModBlocks.INCUBATED_SHANTUNGOSAURUS_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -120,16 +132,17 @@ public class ShantungosaurusEntity extends DinoEntityBase implements GeoEntity { } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.SHANTUNGOSAURUS.get().create(pLevel); - if (child instanceof ShantungosaurusEntity baby) { - ShantungosaurusVariant randomVariant = Util.getRandom(ShantungosaurusVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.SHANTUNGOSAURUS.get().create(pLevel); + if (child instanceof ShantungosaurusEntity baby) { + ShantungosaurusVariant randomVariant = Util.getRandom(ShantungosaurusVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -179,11 +192,13 @@ public class ShantungosaurusEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -248,6 +263,7 @@ public class ShantungosaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -255,12 +271,55 @@ public class ShantungosaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -279,33 +338,35 @@ public class ShantungosaurusEntity extends DinoEntityBase implements GeoEntity { if (!(other instanceof ShantungosaurusEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - /*? if <=1.20.1 {*/ - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { - ShantungosaurusVariant variant = Util.getRandom(ShantungosaurusVariant.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) { - ShantungosaurusVariant variant = Util.getRandom(ShantungosaurusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } - *//*?}*/ + /*? if <=1.20.1 {*/ + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + ShantungosaurusVariant variant = Util.getRandom(ShantungosaurusVariant.values(), this.random); + this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); + return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); + } + /*?} else {*/ + /*@Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + ShantungosaurusVariant variant = Util.getRandom(ShantungosaurusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} + *//*?}*/ @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/SpinosaurusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/SpinosaurusEntity.java index 0154c00..fc8063a 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/SpinosaurusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/SpinosaurusEntity.java @@ -56,10 +56,18 @@ import software.bernie.geckolib.animation.*; public class SpinosaurusEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); + public static final int BABY_TO_ADULT_AGE_TICKS = 86400; + private static final float MIN_ANIMAL_SCALE = 2.2F; + private static final float MAX_ANIMAL_SCALE = 2.6F; + + private float lastDimensionsScale = 1.0F; + private static final EntityDataAccessor VARIANT = SynchedEntityData.defineId(SpinosaurusEntity.class, EntityDataSerializers.INT); private static final EntityDataAccessor DATA_SYNCED_AGE = SynchedEntityData.defineId(SpinosaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(SpinosaurusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -108,10 +116,14 @@ public class SpinosaurusEntity extends DinoEntityBase implements GeoEntity { return ModBlocks.INCUBATED_SPINOSAURUS_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -132,6 +144,7 @@ public class SpinosaurusEntity extends DinoEntityBase implements GeoEntity { if (child instanceof SpinosaurusEntity baby) { SpinosaurusVariant randomVariant = Util.getRandom(SpinosaurusVariant.values(), this.random); baby.setVariant(randomVariant); + baby.setBaby(true); } return child; } @@ -185,10 +198,12 @@ public class SpinosaurusEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } + } } } + updateDynamicDimensions(); + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; @@ -254,19 +269,58 @@ public class SpinosaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { - super.defineSynchedData(pBuilder); - pBuilder.define(VARIANT, 0); - pBuilder.define(DATA_SYNCED_AGE, 0); - } + super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); pBuilder.define(DATA_ANIMAL_SCALE, 1.0F);} *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale());} + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -289,12 +343,16 @@ public class SpinosaurusEntity extends DinoEntityBase implements GeoEntity { public void addAdditionalSaveData(CompoundTag pCompound) { super.addAdditionalSaveData(pCompound); pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); } @Override public void readAdditionalSaveData(CompoundTag pCompound) { super.readAdditionalSaveData(pCompound); this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } } /*? if <=1.20.1 {*/ @@ -302,15 +360,13 @@ public class SpinosaurusEntity extends DinoEntityBase implements GeoEntity { public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { SpinosaurusVariant variant = Util.getRandom(SpinosaurusVariant.values(), this.random); this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); } /*?} else {*/ /*@Override public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { - SpinosaurusVariant variant = Util.getRandom(SpinosaurusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } + SpinosaurusVariant variant = Util.getRandom(SpinosaurusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} *//*?}*/ @Override diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/StegosaurusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/StegosaurusEntity.java index dd2b18e..d5e88c2 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/StegosaurusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/StegosaurusEntity.java @@ -53,10 +53,18 @@ import software.bernie.geckolib.animation.*; public class StegosaurusEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(StegosaurusEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(StegosaurusEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 52800; + private static final float MIN_ANIMAL_SCALE = 1.6F; + private static final float MAX_ANIMAL_SCALE = 2.0F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(StegosaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(StegosaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(StegosaurusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -105,10 +113,14 @@ public class StegosaurusEntity extends DinoEntityBase implements GeoEntity { return ModBlocks.INCUBATED_STEGOSAURUS_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -122,16 +134,17 @@ public class StegosaurusEntity extends DinoEntityBase implements GeoEntity { } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.STEGOSAURUS.get().create(pLevel); - if (child instanceof StegosaurusEntity baby) { - StegosaurusVariant randomVariant = Util.getRandom(StegosaurusVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.STEGOSAURUS.get().create(pLevel); + if (child instanceof StegosaurusEntity baby) { + StegosaurusVariant randomVariant = Util.getRandom(StegosaurusVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -182,11 +195,13 @@ public class StegosaurusEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -251,6 +266,7 @@ public class StegosaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -258,12 +274,55 @@ public class StegosaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -282,33 +341,35 @@ public class StegosaurusEntity extends DinoEntityBase implements GeoEntity { if (!(other instanceof StegosaurusEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - /*? if <=1.20.1 {*/ - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { - StegosaurusVariant variant = Util.getRandom(StegosaurusVariant.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) { - StegosaurusVariant variant = Util.getRandom(StegosaurusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } - *//*?}*/ + /*? if <=1.20.1 {*/ + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + StegosaurusVariant variant = Util.getRandom(StegosaurusVariant.values(), this.random); + this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); + return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); + } + /*?} else {*/ + /*@Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + StegosaurusVariant variant = Util.getRandom(StegosaurusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} + *//*?}*/ @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/StyracosaurusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/StyracosaurusEntity.java index 5eea24b..1b541a8 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/StyracosaurusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/StyracosaurusEntity.java @@ -53,10 +53,18 @@ import software.bernie.geckolib.animation.*; public class StyracosaurusEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(StyracosaurusEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(StyracosaurusEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 67200; + private static final float MIN_ANIMAL_SCALE = 0.5F; + private static final float MAX_ANIMAL_SCALE = 0.9F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(StyracosaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(StyracosaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(StyracosaurusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -105,10 +113,14 @@ public class StyracosaurusEntity extends DinoEntityBase implements GeoEntity { return ModBlocks.INCUBATED_STYRACOSAURUS_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -122,16 +134,17 @@ public class StyracosaurusEntity extends DinoEntityBase implements GeoEntity { } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.STYRACOSAURUS.get().create(pLevel); - if (child instanceof StyracosaurusEntity baby) { - StyracosaurusVariant randomVariant = Util.getRandom(StyracosaurusVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.STYRACOSAURUS.get().create(pLevel); + if (child instanceof StyracosaurusEntity baby) { + StyracosaurusVariant randomVariant = Util.getRandom(StyracosaurusVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -181,11 +194,13 @@ public class StyracosaurusEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -250,6 +265,7 @@ public class StyracosaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -257,12 +273,55 @@ public class StyracosaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -281,33 +340,35 @@ public class StyracosaurusEntity extends DinoEntityBase implements GeoEntity { if (!(other instanceof StyracosaurusEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - /*? if <=1.20.1 {*/ - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { - StyracosaurusVariant variant = Util.getRandom(StyracosaurusVariant.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) { - StyracosaurusVariant variant = Util.getRandom(StyracosaurusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } - *//*?}*/ + /*? if <=1.20.1 {*/ + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + StyracosaurusVariant variant = Util.getRandom(StyracosaurusVariant.values(), this.random); + this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); + return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); + } + /*?} else {*/ + /*@Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + StyracosaurusVariant variant = Util.getRandom(StyracosaurusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} + *//*?}*/ @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/SuchomimusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/SuchomimusEntity.java index ac8b98d..938f1bd 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/SuchomimusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/SuchomimusEntity.java @@ -46,10 +46,18 @@ import software.bernie.geckolib.animation.*; public class SuchomimusEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); + public static final int BABY_TO_ADULT_AGE_TICKS = 72000; + private static final float MIN_ANIMAL_SCALE = 1.7F; + private static final float MAX_ANIMAL_SCALE = 2.1F; + + private float lastDimensionsScale = 1.0F; + private static final EntityDataAccessor VARIANT = SynchedEntityData.defineId(SuchomimusEntity.class, EntityDataSerializers.INT); private static final EntityDataAccessor DATA_SYNCED_AGE = SynchedEntityData.defineId(SuchomimusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(SuchomimusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -103,6 +111,10 @@ public class SuchomimusEntity extends DinoEntityBase implements GeoEntity { return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); } + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } + public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() .add(Attributes.MAX_HEALTH, 55D) @@ -122,6 +134,7 @@ public class SuchomimusEntity extends DinoEntityBase implements GeoEntity { if (child instanceof SuchomimusEntity baby) { SuchomimusVariant randomVariant = Util.getRandom(SuchomimusVariant.values(), this.random); baby.setVariant(randomVariant); + baby.setBaby(true); } return child; } @@ -176,10 +189,12 @@ public class SuchomimusEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } + } } } + updateDynamicDimensions(); + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; @@ -245,19 +260,58 @@ public class SuchomimusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { - super.defineSynchedData(pBuilder); - pBuilder.define(VARIANT, 0); - pBuilder.define(DATA_SYNCED_AGE, 0); - } + super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); pBuilder.define(DATA_ANIMAL_SCALE, 1.0F);} *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale());} + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -280,12 +334,16 @@ public class SuchomimusEntity extends DinoEntityBase implements GeoEntity { public void addAdditionalSaveData(CompoundTag pCompound) { super.addAdditionalSaveData(pCompound); pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); } @Override public void readAdditionalSaveData(CompoundTag pCompound) { super.readAdditionalSaveData(pCompound); this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } } /*? if <=1.20.1 {*/ @@ -293,15 +351,13 @@ public class SuchomimusEntity extends DinoEntityBase implements GeoEntity { public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { SuchomimusVariant variant = Util.getRandom(SuchomimusVariant.values(), this.random); this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); } /*?} else {*/ /*@Override public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { - SuchomimusVariant variant = Util.getRandom(SuchomimusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } + SuchomimusVariant variant = Util.getRandom(SuchomimusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} *//*?}*/ @Override diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/TapejaraEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/TapejaraEntity.java index fa660c5..8e89f81 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/TapejaraEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/TapejaraEntity.java @@ -61,12 +61,20 @@ import software.bernie.geckolib.animation.*; *//*?}*/ public class TapejaraEntity extends DinoEntityBase implements GeoEntity, FlyingAnimal { - private final AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); + private final AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(TapejaraEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(TapejaraEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 24000; + private static final float MIN_ANIMAL_SCALE = 0.4F; + private static final float MAX_ANIMAL_SCALE = 0.8F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(TapejaraEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(TapejaraEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(TapejaraEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -116,10 +124,14 @@ public class TapejaraEntity extends DinoEntityBase implements GeoEntity, FlyingA return ModBlocks.INCUBATED_TAPEJARA_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -157,16 +169,17 @@ public class TapejaraEntity extends DinoEntityBase implements GeoEntity, FlyingA } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.TAPEJARA.get().create(pLevel); - if (child instanceof TapejaraEntity baby) { - TapejaraVariant randomVariant = Util.getRandom(TapejaraVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.TAPEJARA.get().create(pLevel); + if (child instanceof TapejaraEntity baby) { + TapejaraVariant randomVariant = Util.getRandom(TapejaraVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -221,11 +234,13 @@ public class TapejaraEntity extends DinoEntityBase implements GeoEntity, FlyingA double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -290,6 +305,7 @@ public class TapejaraEntity extends DinoEntityBase implements GeoEntity, FlyingA super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -297,12 +313,55 @@ public class TapejaraEntity extends DinoEntityBase implements GeoEntity, FlyingA super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public TapejaraVariant getVariant() { return TapejaraVariant.byId(this.getTypeVariant() & 255); @@ -327,27 +386,29 @@ public class TapejaraEntity extends DinoEntityBase implements GeoEntity, FlyingA public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { TapejaraVariant variant = Util.getRandom(TapejaraVariant.values(), this.random); this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); } /*?} else {*/ /*@Override public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { - TapejaraVariant variant = Util.getRandom(TapejaraVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } + TapejaraVariant variant = Util.getRandom(TapejaraVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} *//*?}*/ @Override public void readAdditionalSaveData(CompoundTag pCompound) { super.readAdditionalSaveData(pCompound); this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } } @Override public void addAdditionalSaveData(CompoundTag pCompound) { super.addAdditionalSaveData(pCompound); pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); } @Override diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/TherizinosaurusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/TherizinosaurusEntity.java index 952b364..ff66172 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/TherizinosaurusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/TherizinosaurusEntity.java @@ -53,10 +53,18 @@ import software.bernie.geckolib.animation.*; public class TherizinosaurusEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(TherizinosaurusEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(TherizinosaurusEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 76800; + private static final float MIN_ANIMAL_SCALE = 1.7F; + private static final float MAX_ANIMAL_SCALE = 2.1F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(TherizinosaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(TherizinosaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(TherizinosaurusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -105,10 +113,14 @@ public class TherizinosaurusEntity extends DinoEntityBase implements GeoEntity { return ModBlocks.INCUBATED_THERIZINOSAURUS_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -122,16 +134,17 @@ public class TherizinosaurusEntity extends DinoEntityBase implements GeoEntity { } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.THERIZINOSAURUS.get().create(pLevel); - if (child instanceof TherizinosaurusEntity baby) { - TherizinosaurusVariant randomVariant = Util.getRandom(TherizinosaurusVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.THERIZINOSAURUS.get().create(pLevel); + if (child instanceof TherizinosaurusEntity baby) { + TherizinosaurusVariant randomVariant = Util.getRandom(TherizinosaurusVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -182,11 +195,13 @@ public class TherizinosaurusEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -251,6 +266,7 @@ public class TherizinosaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -258,12 +274,55 @@ public class TherizinosaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -282,33 +341,35 @@ public class TherizinosaurusEntity extends DinoEntityBase implements GeoEntity { if (!(other instanceof TherizinosaurusEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - /*? if <=1.20.1 {*/ - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { - TherizinosaurusVariant variant = Util.getRandom(TherizinosaurusVariant.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) { - TherizinosaurusVariant variant = Util.getRandom(TherizinosaurusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } - *//*?}*/ + /*? if <=1.20.1 {*/ + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + TherizinosaurusVariant variant = Util.getRandom(TherizinosaurusVariant.values(), this.random); + this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); + return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); + } + /*?} else {*/ + /*@Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + TherizinosaurusVariant variant = Util.getRandom(TherizinosaurusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} + *//*?}*/ @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ThescelosaurusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ThescelosaurusEntity.java index dcbe934..da08782 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ThescelosaurusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ThescelosaurusEntity.java @@ -46,10 +46,18 @@ import software.bernie.geckolib.animation.*; public class ThescelosaurusEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(ThescelosaurusEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(ThescelosaurusEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 43200; + private static final float MIN_ANIMAL_SCALE = 0.5F; + private static final float MAX_ANIMAL_SCALE = 0.9F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(ThescelosaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(ThescelosaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(ThescelosaurusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -98,10 +106,14 @@ public class ThescelosaurusEntity extends DinoEntityBase implements GeoEntity { return ModBlocks.INCUBATED_THESCELOSAURUS_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -115,16 +127,17 @@ public class ThescelosaurusEntity extends DinoEntityBase implements GeoEntity { } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.THESCELOSAURUS.get().create(pLevel); - if (child instanceof ThescelosaurusEntity baby) { - ThescelosaurusVariant randomVariant = Util.getRandom(ThescelosaurusVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.THESCELOSAURUS.get().create(pLevel); + if (child instanceof ThescelosaurusEntity baby) { + ThescelosaurusVariant randomVariant = Util.getRandom(ThescelosaurusVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -171,11 +184,13 @@ public class ThescelosaurusEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -239,6 +254,7 @@ public class ThescelosaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -246,12 +262,55 @@ public class ThescelosaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -270,33 +329,35 @@ public class ThescelosaurusEntity extends DinoEntityBase implements GeoEntity { if (!(other instanceof ThescelosaurusEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - /*? if <=1.20.1 {*/ - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { - ThescelosaurusVariant variant = Util.getRandom(ThescelosaurusVariant.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) { - ThescelosaurusVariant variant = Util.getRandom(ThescelosaurusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } - *//*?}*/ + /*? if <=1.20.1 {*/ + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + ThescelosaurusVariant variant = Util.getRandom(ThescelosaurusVariant.values(), this.random); + this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); + return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); + } + /*?} else {*/ + /*@Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + ThescelosaurusVariant variant = Util.getRandom(ThescelosaurusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} + *//*?}*/ @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/TitanosaurusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/TitanosaurusEntity.java index e85778e..d1cbb5b 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/TitanosaurusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/TitanosaurusEntity.java @@ -55,10 +55,18 @@ import software.bernie.geckolib.animation.*; public class TitanosaurusEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); + public static final int BABY_TO_ADULT_AGE_TICKS = 129600; + private static final float MIN_ANIMAL_SCALE = 2.1F; + private static final float MAX_ANIMAL_SCALE = 2.5F; + + private float lastDimensionsScale = 1.0F; + private static final EntityDataAccessor VARIANT = SynchedEntityData.defineId(TitanosaurusEntity.class, EntityDataSerializers.INT); private static final EntityDataAccessor DATA_SYNCED_AGE = SynchedEntityData.defineId(TitanosaurusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(TitanosaurusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -112,6 +120,10 @@ public class TitanosaurusEntity extends DinoEntityBase implements GeoEntity { return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); } + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } + public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() .add(Attributes.MAX_HEALTH, 250D) @@ -124,16 +136,17 @@ public class TitanosaurusEntity extends DinoEntityBase implements GeoEntity { } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.TITANOSAURUS.get().create(pLevel); - if (child instanceof TitanosaurusEntity baby) { - TitanosaurusVariant randomVariant = Util.getRandom(TitanosaurusVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.TITANOSAURUS.get().create(pLevel); + if (child instanceof TitanosaurusEntity baby) { + TitanosaurusVariant randomVariant = Util.getRandom(TitanosaurusVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -189,6 +202,8 @@ public class TitanosaurusEntity extends DinoEntityBase implements GeoEntity { } } + updateDynamicDimensions(); + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; @@ -254,19 +269,59 @@ public class TitanosaurusEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { - super.defineSynchedData(pBuilder); - pBuilder.define(VARIANT, 0); - pBuilder.define(DATA_SYNCED_AGE, 0); - } + super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); pBuilder.define(DATA_ANIMAL_SCALE, 1.0F);} *//*?}*/ public int getSyncedAge() { return this.entityData.get(DATA_SYNCED_AGE); } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale());} + *//*?}*/ + public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -285,32 +340,35 @@ public class TitanosaurusEntity extends DinoEntityBase implements GeoEntity { if (!(other instanceof TitanosaurusEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } /*? if <=1.20.1 {*/ @Override public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { TitanosaurusVariant variant = Util.getRandom(TitanosaurusVariant.values(), this.random); this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); } - /*?} else {*/ - /*@Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { - TitanosaurusVariant variant = Util.getRandom(TitanosaurusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } + /*?} else {*/ + /*@Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + TitanosaurusVariant variant = Util.getRandom(TitanosaurusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} *//*?}*/ @Override diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/TriceratopsEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/TriceratopsEntity.java index 527af15..df0f811 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/TriceratopsEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/TriceratopsEntity.java @@ -53,10 +53,18 @@ import software.bernie.geckolib.animation.*; public class TriceratopsEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(TriceratopsEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(TriceratopsEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 91200; + private static final float MIN_ANIMAL_SCALE = 1.3F; + private static final float MAX_ANIMAL_SCALE = 1.7F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(TriceratopsEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(TriceratopsEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(TriceratopsEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -105,10 +113,14 @@ public class TriceratopsEntity extends DinoEntityBase implements GeoEntity { return ModBlocks.INCUBATED_TRICERATOPS_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -122,16 +134,17 @@ public class TriceratopsEntity extends DinoEntityBase implements GeoEntity { } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.TRICERATOPS.get().create(pLevel); - if (child instanceof TriceratopsEntity baby) { - TriceratopsVariant randomVariant = Util.getRandom(TriceratopsVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.TRICERATOPS.get().create(pLevel); + if (child instanceof TriceratopsEntity baby) { + TriceratopsVariant randomVariant = Util.getRandom(TriceratopsVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -181,11 +194,13 @@ public class TriceratopsEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -250,6 +265,7 @@ public class TriceratopsEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -257,12 +273,55 @@ public class TriceratopsEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -281,33 +340,35 @@ public class TriceratopsEntity extends DinoEntityBase implements GeoEntity { if (!(other instanceof TriceratopsEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - /*? if <=1.20.1 {*/ - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { - TriceratopsVariant variant = Util.getRandom(TriceratopsVariant.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) { - TriceratopsVariant variant = Util.getRandom(TriceratopsVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } - *//*?}*/ + /*? if <=1.20.1 {*/ + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + TriceratopsVariant variant = Util.getRandom(TriceratopsVariant.values(), this.random); + this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); + return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); + } + /*?} else {*/ + /*@Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + TriceratopsVariant variant = Util.getRandom(TriceratopsVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} + *//*?}*/ @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/TroodonEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/TroodonEntity.java index 22be976..eddd632 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/TroodonEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/TroodonEntity.java @@ -54,10 +54,18 @@ import software.bernie.geckolib.animation.*; public class TroodonEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(TroodonEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(TroodonEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 24000; + private static final float MIN_ANIMAL_SCALE = 0.1F; + private static final float MAX_ANIMAL_SCALE = 0.5F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(TroodonEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(TroodonEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(TroodonEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -106,10 +114,14 @@ public class TroodonEntity extends DinoEntityBase implements GeoEntity { return ModBlocks.INCUBATED_TROODON_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -123,16 +135,17 @@ public class TroodonEntity extends DinoEntityBase implements GeoEntity { } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.TROODON.get().create(pLevel); - if (child instanceof TroodonEntity baby) { - TroodonVariant randomVariant = Util.getRandom(TroodonVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.TROODON.get().create(pLevel); + if (child instanceof TroodonEntity baby) { + TroodonVariant randomVariant = Util.getRandom(TroodonVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -182,11 +195,13 @@ public class TroodonEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -251,6 +266,7 @@ public class TroodonEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -258,12 +274,55 @@ public class TroodonEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -282,33 +341,35 @@ public class TroodonEntity extends DinoEntityBase implements GeoEntity { if (!(other instanceof TroodonEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - /*? if <=1.20.1 {*/ - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { - TroodonVariant variant = Util.getRandom(TroodonVariant.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) { - TroodonVariant variant = Util.getRandom(TroodonVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } - *//*?}*/ + /*? if <=1.20.1 {*/ + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + TroodonVariant variant = Util.getRandom(TroodonVariant.values(), this.random); + this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); + return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); + } + /*?} else {*/ + /*@Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + TroodonVariant variant = Util.getRandom(TroodonVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} + *//*?}*/ @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/TropeognathusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/TropeognathusEntity.java index cd4fc30..5c366a4 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/TropeognathusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/TropeognathusEntity.java @@ -63,10 +63,18 @@ import software.bernie.geckolib.animation.*; public class TropeognathusEntity extends DinoEntityBase implements GeoEntity, FlyingAnimal { private final AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(TropeognathusEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(TropeognathusEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 28800; + private static final float MIN_ANIMAL_SCALE = 1.2F; + private static final float MAX_ANIMAL_SCALE = 1.6F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(TropeognathusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(TropeognathusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(TropeognathusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -116,10 +124,14 @@ public class TropeognathusEntity extends DinoEntityBase implements GeoEntity, Fl return ModBlocks.INCUBATED_TROPEOGNATHUS_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -157,16 +169,17 @@ public class TropeognathusEntity extends DinoEntityBase implements GeoEntity, Fl } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.TROPEOGNATHUS.get().create(pLevel); - if (child instanceof TropeognathusEntity baby) { - TropeognathusVariant randomVariant = Util.getRandom(TropeognathusVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.TROPEOGNATHUS.get().create(pLevel); + if (child instanceof TropeognathusEntity baby) { + TropeognathusVariant randomVariant = Util.getRandom(TropeognathusVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -221,11 +234,13 @@ public class TropeognathusEntity extends DinoEntityBase implements GeoEntity, Fl double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -290,6 +305,7 @@ public class TropeognathusEntity extends DinoEntityBase implements GeoEntity, Fl super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -297,12 +313,55 @@ public class TropeognathusEntity extends DinoEntityBase implements GeoEntity, Fl super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public TropeognathusVariant getVariant() { return TropeognathusVariant.byId(this.getTypeVariant() & 255); @@ -327,28 +386,30 @@ public class TropeognathusEntity extends DinoEntityBase implements GeoEntity, Fl public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { TropeognathusVariant variant = Util.getRandom(TropeognathusVariant.values(), this.random); this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); } /*?} else {*/ /*@Override public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { - TropeognathusVariant variant = Util.getRandom(TropeognathusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } + TropeognathusVariant variant = Util.getRandom(TropeognathusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} *//*?}*/ - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - @Override - public void addAdditionalSaveData(CompoundTag pCompound) { - super.addAdditionalSaveData(pCompound); - pCompound.putInt("Variant", this.getTypeVariant()); - } + @Override + public void addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/TupuxuaraEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/TupuxuaraEntity.java index b8d692d..fed3314 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/TupuxuaraEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/TupuxuaraEntity.java @@ -63,10 +63,18 @@ import software.bernie.geckolib.animation.*; public class TupuxuaraEntity extends DinoEntityBase implements GeoEntity, FlyingAnimal { private final AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); + public static final int BABY_TO_ADULT_AGE_TICKS = 28800; + private static final float MIN_ANIMAL_SCALE = 0.8F; + private static final float MAX_ANIMAL_SCALE = 1.2F; + + private float lastDimensionsScale = 1.0F; + private static final EntityDataAccessor VARIANT = SynchedEntityData.defineId(TupuxuaraEntity.class, EntityDataSerializers.INT); private static final EntityDataAccessor DATA_SYNCED_AGE = SynchedEntityData.defineId(TupuxuaraEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(TupuxuaraEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -116,10 +124,14 @@ public class TupuxuaraEntity extends DinoEntityBase implements GeoEntity, Flying return ModBlocks.INCUBATED_TUPUXUARA_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -164,6 +176,7 @@ public class TupuxuaraEntity extends DinoEntityBase implements GeoEntity, Flying if (child instanceof TupuxuaraEntity baby) { TupuxuaraVariant randomVariant = Util.getRandom(TupuxuaraVariant.values(), this.random); baby.setVariant(randomVariant); + baby.setBaby(true); } return child; } @@ -221,10 +234,12 @@ public class TupuxuaraEntity extends DinoEntityBase implements GeoEntity, Flying double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } + } } } + updateDynamicDimensions(); + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; @@ -290,19 +305,58 @@ public class TupuxuaraEntity extends DinoEntityBase implements GeoEntity, Flying super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { - super.defineSynchedData(pBuilder); - pBuilder.define(VARIANT, 0); - pBuilder.define(DATA_SYNCED_AGE, 0); - } + super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); pBuilder.define(DATA_ANIMAL_SCALE, 1.0F);} *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale());} + *//*?}*/ public TupuxuaraVariant getVariant() { return TupuxuaraVariant.byId(this.getTypeVariant() & 255); @@ -327,27 +381,29 @@ public class TupuxuaraEntity extends DinoEntityBase implements GeoEntity, Flying public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { TupuxuaraVariant variant = Util.getRandom(TupuxuaraVariant.values(), this.random); this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); } /*?} else {*/ /*@Override public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { - TupuxuaraVariant variant = Util.getRandom(TupuxuaraVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } + TupuxuaraVariant variant = Util.getRandom(TupuxuaraVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} *//*?}*/ @Override public void readAdditionalSaveData(CompoundTag pCompound) { super.readAdditionalSaveData(pCompound); this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } } @Override public void addAdditionalSaveData(CompoundTag pCompound) { super.addAdditionalSaveData(pCompound); pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); } @Override diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/TyrannosaurusRexEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/TyrannosaurusRexEntity.java index 6883af0..bcf018f 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/TyrannosaurusRexEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/TyrannosaurusRexEntity.java @@ -57,10 +57,18 @@ import software.bernie.geckolib.animation.*; public class TyrannosaurusRexEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); + public static final int BABY_TO_ADULT_AGE_TICKS = 91200; + private static final float MIN_ANIMAL_SCALE = 2.3F; + private static final float MAX_ANIMAL_SCALE = 2.7F; + + private float lastDimensionsScale = 1.0F; + private static final EntityDataAccessor VARIANT = SynchedEntityData.defineId(TyrannosaurusRexEntity.class, EntityDataSerializers.INT); private static final EntityDataAccessor DATA_SYNCED_AGE = SynchedEntityData.defineId(TyrannosaurusRexEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(TyrannosaurusRexEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -114,6 +122,10 @@ public class TyrannosaurusRexEntity extends DinoEntityBase implements GeoEntity return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); } + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } + public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() .add(Attributes.MAX_HEALTH, 80D) @@ -133,6 +145,7 @@ public class TyrannosaurusRexEntity extends DinoEntityBase implements GeoEntity if (child instanceof TyrannosaurusRexEntity baby) { TyrannosaurusRexVariant randomVariant = Util.getRandom(TyrannosaurusRexVariant.values(), this.random); baby.setVariant(randomVariant); + baby.setBaby(true); } return child; } @@ -190,6 +203,8 @@ public class TyrannosaurusRexEntity extends DinoEntityBase implements GeoEntity } } + updateDynamicDimensions(); + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; @@ -255,19 +270,58 @@ public class TyrannosaurusRexEntity extends DinoEntityBase implements GeoEntity super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { - super.defineSynchedData(pBuilder); - pBuilder.define(VARIANT, 0); - pBuilder.define(DATA_SYNCED_AGE, 0); - } + super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); pBuilder.define(DATA_ANIMAL_SCALE, 1.0F);} *//*?}*/ public int getSyncedAge() { return this.entityData.get(DATA_SYNCED_AGE); } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale());} + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -290,12 +344,16 @@ public class TyrannosaurusRexEntity extends DinoEntityBase implements GeoEntity public void addAdditionalSaveData(CompoundTag pCompound) { super.addAdditionalSaveData(pCompound); pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); } @Override public void readAdditionalSaveData(CompoundTag pCompound) { super.readAdditionalSaveData(pCompound); this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } } /*? if <=1.20.1 {*/ @@ -303,15 +361,13 @@ public class TyrannosaurusRexEntity extends DinoEntityBase implements GeoEntity public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { TyrannosaurusRexVariant variant = Util.getRandom(TyrannosaurusRexVariant.values(), this.random); this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); } /*?} else {*/ /*@Override public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { - TyrannosaurusRexVariant variant = Util.getRandom(TyrannosaurusRexVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } + TyrannosaurusRexVariant variant = Util.getRandom(TyrannosaurusRexVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} *//*?}*/ @Override diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/UtahraptorEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/UtahraptorEntity.java index c34d302..1f30a9c 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/UtahraptorEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/UtahraptorEntity.java @@ -53,10 +53,18 @@ import software.bernie.geckolib.animation.*; public class UtahraptorEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(UtahraptorEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(UtahraptorEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 43200; + private static final float MIN_ANIMAL_SCALE = 0.8F; + private static final float MAX_ANIMAL_SCALE = 1.2F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(UtahraptorEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(UtahraptorEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(UtahraptorEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -105,10 +113,14 @@ public class UtahraptorEntity extends DinoEntityBase implements GeoEntity { return ModBlocks.INCUBATED_UTAHRAPTOR_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -122,16 +134,17 @@ public class UtahraptorEntity extends DinoEntityBase implements GeoEntity { } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.UTAHRAPTOR.get().create(pLevel); - if (child instanceof UtahraptorEntity baby) { - UtahraptorVariant randomVariant = Util.getRandom(UtahraptorVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.UTAHRAPTOR.get().create(pLevel); + if (child instanceof UtahraptorEntity baby) { + UtahraptorVariant randomVariant = Util.getRandom(UtahraptorVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -181,11 +194,13 @@ public class UtahraptorEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -250,6 +265,7 @@ public class UtahraptorEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -257,12 +273,55 @@ public class UtahraptorEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -281,33 +340,35 @@ public class UtahraptorEntity extends DinoEntityBase implements GeoEntity { if (!(other instanceof UtahraptorEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - /*? if <=1.20.1 {*/ - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { - UtahraptorVariant variant = Util.getRandom(UtahraptorVariant.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) { - UtahraptorVariant variant = Util.getRandom(UtahraptorVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } - *//*?}*/ + /*? if <=1.20.1 {*/ + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + UtahraptorVariant variant = Util.getRandom(UtahraptorVariant.values(), this.random); + this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); + return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); + } + /*?} else {*/ + /*@Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + UtahraptorVariant variant = Util.getRandom(UtahraptorVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} + *//*?}*/ @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/VelociraptorEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/VelociraptorEntity.java index 7de1746..5fda18e 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/VelociraptorEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/VelociraptorEntity.java @@ -54,10 +54,18 @@ import software.bernie.geckolib.animation.*; public class VelociraptorEntity extends DinoEntityBase implements GeoEntity { private AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); - private static final EntityDataAccessor VARIANT = - SynchedEntityData.defineId(VelociraptorEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_SYNCED_AGE = - SynchedEntityData.defineId(VelociraptorEntity.class, EntityDataSerializers.INT); + public static final int BABY_TO_ADULT_AGE_TICKS = 28800; + private static final float MIN_ANIMAL_SCALE = 0.8F; + private static final float MAX_ANIMAL_SCALE = 1.2F; + + private float lastDimensionsScale = 1.0F; + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(VelociraptorEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_SYNCED_AGE = + SynchedEntityData.defineId(VelociraptorEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(VelociraptorEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -106,10 +114,14 @@ public class VelociraptorEntity extends DinoEntityBase implements GeoEntity { return ModBlocks.INCUBATED_VELOCIRAPTOR_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -123,16 +135,17 @@ public class VelociraptorEntity extends DinoEntityBase implements GeoEntity { } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { - AgeableMob child = ModEntities.VELOCIRAPTOR.get().create(pLevel); - if (child instanceof VelociraptorEntity baby) { - VelociraptorVariant randomVariant = Util.getRandom(VelociraptorVariant.values(), this.random); - baby.setVariant(randomVariant); - } - return child; - } + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel pLevel, AgeableMob pOtherParent) { + AgeableMob child = ModEntities.VELOCIRAPTOR.get().create(pLevel); + if (child instanceof VelociraptorEntity baby) { + VelociraptorVariant randomVariant = Util.getRandom(VelociraptorVariant.values(), this.random); + baby.setVariant(randomVariant); + baby.setBaby(true); + } + return child; + } @Override public boolean doHurtTarget(Entity target) { @@ -183,11 +196,13 @@ public class VelociraptorEntity extends DinoEntityBase implements GeoEntity { double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } - } - } + } + } + } - if (!level().isClientSide) { + updateDynamicDimensions(); + + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; } else { @@ -252,6 +267,7 @@ public class VelociraptorEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override @@ -259,12 +275,55 @@ public class VelociraptorEntity extends DinoEntityBase implements GeoEntity { super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); + pBuilder.define(DATA_ANIMAL_SCALE, 1.0F); } *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + *//*?}*/ public int getTypeVariant() { return this.entityData.get(VARIANT); } @@ -283,33 +342,35 @@ public class VelociraptorEntity extends DinoEntityBase implements GeoEntity { if (!(other instanceof VelociraptorEntity 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 addAdditionalSaveData(CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); + } - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - super.readAdditionalSaveData(pCompound); - this.entityData.set(VARIANT, pCompound.getInt("Variant")); - } + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } + } - /*? if <=1.20.1 {*/ - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { - VelociraptorVariant variant = Util.getRandom(VelociraptorVariant.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) { - VelociraptorVariant variant = Util.getRandom(VelociraptorVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } - *//*?}*/ + /*? if <=1.20.1 {*/ + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + VelociraptorVariant variant = Util.getRandom(VelociraptorVariant.values(), this.random); + this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); + return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); + } + /*?} else {*/ + /*@Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + VelociraptorVariant variant = Util.getRandom(VelociraptorVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} + *//*?}*/ @Override public AnimatableInstanceCache getAnimatableInstanceCache() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ZhenyuanopterusEntity.java b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ZhenyuanopterusEntity.java index 24f2fd4..beb14fa 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ZhenyuanopterusEntity.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/custom/ZhenyuanopterusEntity.java @@ -63,10 +63,18 @@ import software.bernie.geckolib.animation.*; public class ZhenyuanopterusEntity extends DinoEntityBase implements GeoEntity, FlyingAnimal { private final AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); + public static final int BABY_TO_ADULT_AGE_TICKS = 28800; + private static final float MIN_ANIMAL_SCALE = 0.9F; + private static final float MAX_ANIMAL_SCALE = 1.3F; + + private float lastDimensionsScale = 1.0F; + private static final EntityDataAccessor VARIANT = SynchedEntityData.defineId(ZhenyuanopterusEntity.class, EntityDataSerializers.INT); private static final EntityDataAccessor DATA_SYNCED_AGE = SynchedEntityData.defineId(ZhenyuanopterusEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ANIMAL_SCALE = + SynchedEntityData.defineId(ZhenyuanopterusEntity.class, EntityDataSerializers.FLOAT); // Procedural tail sway state (client-side use for rendering) private float tailSwayOffset; // Smoothed offset in range roughly [-1, 1] @@ -116,10 +124,14 @@ public class ZhenyuanopterusEntity extends DinoEntityBase implements GeoEntity, return ModBlocks.INCUBATED_ZHENYUANOPTERUS_EGG.get(); } - @Override - public DinoAIConfig getAIConfig() { - return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); - } + @Override + public DinoAIConfig getAIConfig() { + return new DinoAIConfig(0.3D, 1.1D, 1.5D, 100, 100, 0.05f, 0.1f, 20); + } + + public void setBaby(boolean baby) { + this.setAge(baby ? -BABY_TO_ADULT_AGE_TICKS : 0); + } public static AttributeSupplier.Builder createAttributes() { return Animal.createLivingAttributes() @@ -164,6 +176,7 @@ public class ZhenyuanopterusEntity extends DinoEntityBase implements GeoEntity, if (child instanceof ZhenyuanopterusEntity baby) { ZhenyuanopterusVariant randomVariant = Util.getRandom(ZhenyuanopterusVariant.values(), this.random); baby.setVariant(randomVariant); + baby.setBaby(true); } return child; } @@ -221,10 +234,12 @@ public class ZhenyuanopterusEntity extends DinoEntityBase implements GeoEntity, double healthRatio = this.getHealth() / (float) oldMax; maxHealthAttr.setBaseValue(desired); this.setHealth((float) (desired * Mth.clamp(healthRatio, 0.0F, 1.0F))); - } + } } } + updateDynamicDimensions(); + if (!level().isClientSide) { if (mouthAnimCooldown > 0) { mouthAnimCooldown--; @@ -290,19 +305,58 @@ public class ZhenyuanopterusEntity extends DinoEntityBase implements GeoEntity, super.defineSynchedData(); this.entityData.define(VARIANT, 0); this.entityData.define(DATA_SYNCED_AGE, 0); + this.entityData.define(DATA_ANIMAL_SCALE, 1.0F); } /*?} else {*/ /*@Override protected void defineSynchedData(SynchedEntityData.Builder pBuilder) { - super.defineSynchedData(pBuilder); - pBuilder.define(VARIANT, 0); - pBuilder.define(DATA_SYNCED_AGE, 0); - } + super.defineSynchedData(pBuilder); pBuilder.define(VARIANT, 0); pBuilder.define(DATA_SYNCED_AGE, 0); pBuilder.define(DATA_ANIMAL_SCALE, 1.0F);} *//*?}*/ - public int getSyncedAge() { - return this.entityData.get(DATA_SYNCED_AGE); - } + public int getSyncedAge() { + return this.entityData.get(DATA_SYNCED_AGE); + } + + public float getAnimalScale() { + return this.entityData.get(DATA_ANIMAL_SCALE); + } + + private void setAnimalScale(float animalScale) { + this.entityData.set(DATA_ANIMAL_SCALE, animalScale); + } + + public float getGrowthScale() { + if (!this.isBaby()) { + return 1.0F; + } + + int age = this.level().isClientSide ? this.getSyncedAge() : this.getAge(); + float growthProgress = Mth.clamp((BABY_TO_ADULT_AGE_TICKS + age) / (float) BABY_TO_ADULT_AGE_TICKS, 0.0F, 1.0F); + return Mth.lerp(growthProgress, 0.2F, 1.0F); + } + + public float getTotalModelScale() { + return this.getAnimalScale() * this.getGrowthScale(); + } + + private void updateDynamicDimensions() { + float dimensionsScale = this.getTotalModelScale(); + if (Math.abs(dimensionsScale - this.lastDimensionsScale) > 0.01F) { + this.lastDimensionsScale = dimensionsScale; + this.refreshDimensions(); + } + } + + /*? if <=1.20.1 {*/ + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale()); + } + /*?} else {*/ + /*@Override + protected EntityDimensions getDefaultDimensions(Pose pose) { + return this.getType().getDimensions().scale(this.getTotalModelScale());} + *//*?}*/ public ZhenyuanopterusVariant getVariant() { return ZhenyuanopterusVariant.byId(this.getTypeVariant() & 255); @@ -327,27 +381,29 @@ public class ZhenyuanopterusEntity extends DinoEntityBase implements GeoEntity, public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { ZhenyuanopterusVariant variant = Util.getRandom(ZhenyuanopterusVariant.values(), this.random); this.setVariant(variant); + this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); } /*?} else {*/ /*@Override public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { - ZhenyuanopterusVariant variant = Util.getRandom(ZhenyuanopterusVariant.values(), this.random); - this.setVariant(variant); - return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); - } + ZhenyuanopterusVariant variant = Util.getRandom(ZhenyuanopterusVariant.values(), this.random); this.setVariant(variant); this.setAnimalScale(Mth.nextFloat(this.random, MIN_ANIMAL_SCALE, MAX_ANIMAL_SCALE)); return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData);} *//*?}*/ @Override public void readAdditionalSaveData(CompoundTag pCompound) { super.readAdditionalSaveData(pCompound); this.entityData.set(VARIANT, pCompound.getInt("Variant")); + if (pCompound.contains("AnimalScale")) { + this.setAnimalScale(pCompound.getFloat("AnimalScale")); + } } @Override public void addAdditionalSaveData(CompoundTag pCompound) { super.addAdditionalSaveData(pCompound); pCompound.putInt("Variant", this.getTypeVariant()); + pCompound.putFloat("AnimalScale", this.getAnimalScale()); } @Override diff --git a/common/src/main/java/net/cmr/jurassicrevived/item/ModCreativeTabs.java b/common/src/main/java/net/cmr/jurassicrevived/item/ModCreativeTabs.java index f6ac50e..58c2c65 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/item/ModCreativeTabs.java +++ b/common/src/main/java/net/cmr/jurassicrevived/item/ModCreativeTabs.java @@ -26,6 +26,7 @@ public class ModCreativeTabs { output.accept(ModItems.CRUSHED_FOSSIL.get()); output.accept(ModItems.MOSQUITO_IN_AMBER.get()); output.accept(ModItems.FROZEN_LEECH.get()); + output.accept(ModItems.FROZEN_BONE.get()); output.accept(ModItems.CABLE.get()); output.accept(ModItems.SCREEN.get()); output.accept(ModItems.PROCESSOR.get()); @@ -103,6 +104,7 @@ public class ModCreativeTabs { output.accept(ModBlocks.DEEPSLATE_FOSSIL.get()); output.accept(ModBlocks.AMBER_ORE.get()); output.accept(ModBlocks.DEEPSLATE_ICE_SHARD_ORE.get()); + output.accept(ModBlocks.PERMAFROST.get()); }); })); diff --git a/common/src/main/java/net/cmr/jurassicrevived/item/ModItems.java b/common/src/main/java/net/cmr/jurassicrevived/item/ModItems.java index 89805cc..80372af 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/item/ModItems.java +++ b/common/src/main/java/net/cmr/jurassicrevived/item/ModItems.java @@ -194,6 +194,7 @@ public class ModItems { public static final RegistrySupplier TEST_TUBE = ITEMS.register("test_tube", () -> new Item(new Item.Properties().stacksTo(16))); public static final RegistrySupplier SYRINGE = ITEMS.register("syringe", () -> new FrogSyringeItem(new Item.Properties().stacksTo(16))); public static final RegistrySupplier MOSQUITO_IN_AMBER = ITEMS.register("mosquito_in_amber", () -> new Item(new Item.Properties().stacksTo(16).rarity(Rarity.UNCOMMON))); + public static final RegistrySupplier FROZEN_BONE = ITEMS.register("frozen_bone", () -> new Item(new Item.Properties().stacksTo(16).rarity(Rarity.RARE))); public static final RegistrySupplier CRUSHED_FOSSIL = ITEMS.register("crushed_fossil", () -> new Item(new Item.Properties())); public static final RegistrySupplier FROZEN_LEECH = ITEMS.register("frozen_leech", () -> new Item(new Item.Properties().stacksTo(16).rarity(Rarity.RARE))); public static final RegistrySupplier CABLE = ITEMS.register("cable", () -> new Item(new Item.Properties().stacksTo(16))); diff --git a/common/src/main/java/net/cmr/jurassicrevived/worldgen/ModWorldgenDefinitions.java b/common/src/main/java/net/cmr/jurassicrevived/worldgen/ModWorldgenDefinitions.java index e8fe00c..7fb69fa 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/worldgen/ModWorldgenDefinitions.java +++ b/common/src/main/java/net/cmr/jurassicrevived/worldgen/ModWorldgenDefinitions.java @@ -1,11 +1,16 @@ package net.cmr.jurassicrevived.worldgen; +import dev.architectury.registry.registries.RegistrySupplier; 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.BiomeTags; // <-- Add this import import net.minecraft.tags.BlockTags; import net.minecraft.tags.TagKey; +import net.minecraft.world.food.FoodProperties; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.biome.Biome; // <-- Add this import import net.minecraft.world.level.block.Block; import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; import net.minecraft.world.level.levelgen.placement.PlacedFeature; @@ -16,6 +21,8 @@ import java.util.function.Supplier; public final class ModWorldgenDefinitions { private ModWorldgenDefinitions() { } + public static final TagKey SNOWY_BIOMES = TagKey.create(Registries.BIOME, Constants.rl("is_snowy")); + public static final List ORES = List.of( new OreDefinition( @@ -25,7 +32,8 @@ public final class ModWorldgenDefinitions { 18, 20, 32, - 64 + 64, + BiomeTags.IS_OVERWORLD // <-- Add biome tag ), new OreDefinition( "stone_fossil", @@ -34,7 +42,8 @@ public final class ModWorldgenDefinitions { 8, 15, 0, - 64 + 64, + BiomeTags.IS_OVERWORLD ), new OreDefinition( "deepslate_fossil", @@ -43,7 +52,8 @@ public final class ModWorldgenDefinitions { 8, 15, -32, - 0 + 0, + BiomeTags.IS_OVERWORLD ), new OreDefinition( "amber_ore", @@ -52,7 +62,8 @@ public final class ModWorldgenDefinitions { 3, 4, 0, - 32 + 32, + BiomeTags.IS_OVERWORLD ), new OreDefinition( "deepslate_ice_shard_ore", @@ -61,7 +72,19 @@ public final class ModWorldgenDefinitions { 3, 6, -32, - 0 + 0, + BiomeTags.IS_OVERWORLD + ), + // Add your new Permafrost generation here! + new OreDefinition( + "permafrost", + ModBlocks.PERMAFROST, + BlockTags.DIRT, + 16, // Vein Size + 6, // Count + 60, // Min Y + 140,// Max Y + SNOWY_BIOMES ) ); @@ -72,7 +95,8 @@ public final class ModWorldgenDefinitions { int veinSize, int count, int minY, - int maxY + int maxY, + TagKey biomeTag // <-- Add this to the record ) { public ResourceKey> configuredFeatureKey() { return ResourceKey.create(Registries.CONFIGURED_FEATURE, Constants.rl(name)); @@ -82,4 +106,4 @@ public final class ModWorldgenDefinitions { return ResourceKey.create(Registries.PLACED_FEATURE, Constants.rl(name + "_placed")); } } -} +} \ No newline at end of file diff --git a/common/src/main/resources/assets/jurassicrevived/textures/block/deepslate_fossil.png b/common/src/main/resources/assets/jurassicrevived/textures/block/deepslate_fossil.png deleted file mode 100644 index 1557379..0000000 Binary files a/common/src/main/resources/assets/jurassicrevived/textures/block/deepslate_fossil.png and /dev/null differ diff --git a/common/src/main/resources/assets/jurassicrevived/textures/block/deepslate_fossil_egg.png b/common/src/main/resources/assets/jurassicrevived/textures/block/deepslate_fossil_egg.png new file mode 100644 index 0000000..a42c034 Binary files /dev/null and b/common/src/main/resources/assets/jurassicrevived/textures/block/deepslate_fossil_egg.png differ diff --git a/common/src/main/resources/assets/jurassicrevived/textures/block/deepslate_fossil_rib.png b/common/src/main/resources/assets/jurassicrevived/textures/block/deepslate_fossil_rib.png new file mode 100644 index 0000000..bfe7779 Binary files /dev/null and b/common/src/main/resources/assets/jurassicrevived/textures/block/deepslate_fossil_rib.png differ diff --git a/common/src/main/resources/assets/jurassicrevived/textures/block/deepslate_fossil_skull.png b/common/src/main/resources/assets/jurassicrevived/textures/block/deepslate_fossil_skull.png new file mode 100644 index 0000000..659d790 Binary files /dev/null and b/common/src/main/resources/assets/jurassicrevived/textures/block/deepslate_fossil_skull.png differ diff --git a/common/src/main/resources/assets/jurassicrevived/textures/block/permafrost_bottom.png b/common/src/main/resources/assets/jurassicrevived/textures/block/permafrost_bottom.png new file mode 100644 index 0000000..dd79ad6 Binary files /dev/null and b/common/src/main/resources/assets/jurassicrevived/textures/block/permafrost_bottom.png differ diff --git a/common/src/main/resources/assets/jurassicrevived/textures/block/permafrost_side.png b/common/src/main/resources/assets/jurassicrevived/textures/block/permafrost_side.png new file mode 100644 index 0000000..699f85a Binary files /dev/null and b/common/src/main/resources/assets/jurassicrevived/textures/block/permafrost_side.png differ diff --git a/common/src/main/resources/assets/jurassicrevived/textures/block/permafrost_top.png b/common/src/main/resources/assets/jurassicrevived/textures/block/permafrost_top.png new file mode 100644 index 0000000..dce1e37 Binary files /dev/null and b/common/src/main/resources/assets/jurassicrevived/textures/block/permafrost_top.png differ diff --git a/common/src/main/resources/assets/jurassicrevived/textures/block/stone_fossil.png b/common/src/main/resources/assets/jurassicrevived/textures/block/stone_fossil.png deleted file mode 100644 index b9fde77..0000000 Binary files a/common/src/main/resources/assets/jurassicrevived/textures/block/stone_fossil.png and /dev/null differ diff --git a/common/src/main/resources/assets/jurassicrevived/textures/block/stone_fossil_egg.png b/common/src/main/resources/assets/jurassicrevived/textures/block/stone_fossil_egg.png new file mode 100644 index 0000000..c9c209d Binary files /dev/null and b/common/src/main/resources/assets/jurassicrevived/textures/block/stone_fossil_egg.png differ diff --git a/common/src/main/resources/assets/jurassicrevived/textures/block/stone_fossil_rib.png b/common/src/main/resources/assets/jurassicrevived/textures/block/stone_fossil_rib.png new file mode 100644 index 0000000..5984d34 Binary files /dev/null and b/common/src/main/resources/assets/jurassicrevived/textures/block/stone_fossil_rib.png differ diff --git a/common/src/main/resources/assets/jurassicrevived/textures/block/stone_fossil_skull.png b/common/src/main/resources/assets/jurassicrevived/textures/block/stone_fossil_skull.png new file mode 100644 index 0000000..e612527 Binary files /dev/null and b/common/src/main/resources/assets/jurassicrevived/textures/block/stone_fossil_skull.png differ diff --git a/common/src/main/resources/assets/jurassicrevived/textures/entity/allosaurus_al.png b/common/src/main/resources/assets/jurassicrevived/textures/entity/allosaurus_al.png new file mode 100644 index 0000000..5e8092b Binary files /dev/null and b/common/src/main/resources/assets/jurassicrevived/textures/entity/allosaurus_al.png differ diff --git a/common/src/main/resources/assets/jurassicrevived/textures/entity/ankylosaurus_bumpy.png b/common/src/main/resources/assets/jurassicrevived/textures/entity/ankylosaurus_bumpy.png new file mode 100644 index 0000000..76c9b3b Binary files /dev/null and b/common/src/main/resources/assets/jurassicrevived/textures/entity/ankylosaurus_bumpy.png differ diff --git a/common/src/main/resources/assets/jurassicrevived/textures/entity/dilophosaurus_inferno.png b/common/src/main/resources/assets/jurassicrevived/textures/entity/dilophosaurus_inferno.png new file mode 100644 index 0000000..3e43435 Binary files /dev/null and b/common/src/main/resources/assets/jurassicrevived/textures/entity/dilophosaurus_inferno.png differ diff --git a/common/src/main/resources/assets/jurassicrevived/textures/entity/ludodactylus_pinwin.png b/common/src/main/resources/assets/jurassicrevived/textures/entity/ludodactylus_pinwin.png new file mode 100644 index 0000000..ecd3dff Binary files /dev/null and b/common/src/main/resources/assets/jurassicrevived/textures/entity/ludodactylus_pinwin.png differ diff --git a/common/src/main/resources/assets/jurassicrevived/textures/entity/tyrannosaurus_rex_drgray.png b/common/src/main/resources/assets/jurassicrevived/textures/entity/tyrannosaurus_rex_drgray.png new file mode 100644 index 0000000..c861a61 Binary files /dev/null and b/common/src/main/resources/assets/jurassicrevived/textures/entity/tyrannosaurus_rex_drgray.png differ diff --git a/common/src/main/resources/assets/jurassicrevived/textures/entity/tyrannosaurus_rex_ember.png b/common/src/main/resources/assets/jurassicrevived/textures/entity/tyrannosaurus_rex_ember.png new file mode 100644 index 0000000..1b4cecb Binary files /dev/null and b/common/src/main/resources/assets/jurassicrevived/textures/entity/tyrannosaurus_rex_ember.png differ diff --git a/common/src/main/resources/assets/jurassicrevived/textures/entity/velociraptor_blue.png b/common/src/main/resources/assets/jurassicrevived/textures/entity/velociraptor_blue.png new file mode 100644 index 0000000..62a5fa2 Binary files /dev/null and b/common/src/main/resources/assets/jurassicrevived/textures/entity/velociraptor_blue.png differ diff --git a/common/src/main/resources/assets/jurassicrevived/textures/entity/velociraptor_charlie.png b/common/src/main/resources/assets/jurassicrevived/textures/entity/velociraptor_charlie.png new file mode 100644 index 0000000..b11e868 Binary files /dev/null and b/common/src/main/resources/assets/jurassicrevived/textures/entity/velociraptor_charlie.png differ diff --git a/common/src/main/resources/assets/jurassicrevived/textures/entity/velociraptor_delta.png b/common/src/main/resources/assets/jurassicrevived/textures/entity/velociraptor_delta.png new file mode 100644 index 0000000..3d82750 Binary files /dev/null and b/common/src/main/resources/assets/jurassicrevived/textures/entity/velociraptor_delta.png differ diff --git a/common/src/main/resources/assets/jurassicrevived/textures/entity/velociraptor_echo.png b/common/src/main/resources/assets/jurassicrevived/textures/entity/velociraptor_echo.png new file mode 100644 index 0000000..9c4bc67 Binary files /dev/null and b/common/src/main/resources/assets/jurassicrevived/textures/entity/velociraptor_echo.png differ diff --git a/common/src/main/resources/assets/jurassicrevived/textures/item/frozen_bone.png b/common/src/main/resources/assets/jurassicrevived/textures/item/frozen_bone.png new file mode 100644 index 0000000..57b28cc Binary files /dev/null and b/common/src/main/resources/assets/jurassicrevived/textures/item/frozen_bone.png differ diff --git a/fabricmc/src/main/java/net/cmr/jurassicrevived/JRMod.java b/fabricmc/src/main/java/net/cmr/jurassicrevived/JRMod.java index f247317..a2f6468 100755 --- a/fabricmc/src/main/java/net/cmr/jurassicrevived/JRMod.java +++ b/fabricmc/src/main/java/net/cmr/jurassicrevived/JRMod.java @@ -2,7 +2,10 @@ package net.cmr.jurassicrevived; import net.cmr.jurassicrevived.block.entity.ModBlockEntities; import net.cmr.jurassicrevived.block.entity.custom.*; +import net.cmr.jurassicrevived.worldgen.ModWorldgenDefinitions; import net.fabricmc.api.ModInitializer; +import net.fabricmc.fabric.api.biome.v1.BiomeModifications; +import net.fabricmc.fabric.api.biome.v1.BiomeSelectors; import net.fabricmc.fabric.api.transfer.v1.fluid.FluidStorage; import net.cmr.jurassicrevived.platform.FabricEnergyWrapper; import net.cmr.jurassicrevived.platform.FabricTransferHelper; @@ -10,6 +13,7 @@ import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.transfer.v1.fluid.FluidStorage; import net.fabricmc.fabric.api.transfer.v1.item.InventoryStorage; import net.fabricmc.fabric.api.transfer.v1.item.ItemStorage; +import net.minecraft.world.level.levelgen.GenerationStep; import team.reborn.energy.api.EnergyStorage; public class JRMod implements ModInitializer @@ -25,6 +29,14 @@ public class JRMod implements ModInitializer // Use Fabric to bootstrap the Common mod. CommonClass.init(); + for (ModWorldgenDefinitions.OreDefinition ore : ModWorldgenDefinitions.ORES) { + BiomeModifications.addFeature( + BiomeSelectors.tag(ore.biomeTag()), // Dynamically uses IS_OVERWORLD or IS_SNOWY + GenerationStep.Decoration.UNDERGROUND_ORES, + ore.placedFeatureKey() + ); + } + FluidStorage.SIDED.registerForBlockEntities((be, side) -> new FabricTransferHelper.InternalFluidStorage(((TankBlockEntity) be).getFluidHandler(side)), ModBlockEntities.TANK_BE.get() diff --git a/fabricmc/src/main/java/net/cmr/jurassicrevived/datagen/FabricBlockLootTableProvider.java b/fabricmc/src/main/java/net/cmr/jurassicrevived/datagen/FabricBlockLootTableProvider.java index b2bf542..271b767 100644 --- a/fabricmc/src/main/java/net/cmr/jurassicrevived/datagen/FabricBlockLootTableProvider.java +++ b/fabricmc/src/main/java/net/cmr/jurassicrevived/datagen/FabricBlockLootTableProvider.java @@ -9,9 +9,11 @@ import net.minecraft.world.item.enchantment.Enchantment; import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.storage.loot.LootTable; +import net.minecraft.world.level.storage.loot.entries.AlternativesEntry; import net.minecraft.world.level.storage.loot.entries.LootItem; import net.minecraft.world.level.storage.loot.functions.ApplyBonusCount; import net.minecraft.world.level.storage.loot.functions.SetItemCountFunction; +import net.minecraft.world.level.storage.loot.predicates.LootItemRandomChanceCondition; import net.minecraft.world.level.storage.loot.providers.number.UniformGenerator; import java.util.concurrent.CompletableFuture; @@ -59,6 +61,20 @@ public class FabricBlockLootTableProvider extends net.fabricmc.fabric.api.datage //?} } + @Override + public LootTable.Builder createRandomOreDrops(Block block, Item silkTouchDrop, Item firstDrop, Item secondDrop, float minRolls, float maxRolls, double firstDropChance) { + return this.createSilkTouchDispatchTable(block, + AlternativesEntry.alternatives( + this.applyExplosionDecay(block, + LootItem.lootTableItem(firstDrop) + .when(LootItemRandomChanceCondition.randomChance((float) firstDropChance)) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(minRolls, maxRolls)))), + this.applyExplosionDecay(block, + LootItem.lootTableItem(secondDrop) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(minRolls, maxRolls)))) + )); + } + @Override public LootTable.Builder createPotFlowerItemTable(Block block) { return super.createPotFlowerItemTable(block); diff --git a/fabricmc/src/main/java/net/cmr/jurassicrevived/datagen/FabricModModelProvider.java b/fabricmc/src/main/java/net/cmr/jurassicrevived/datagen/FabricModModelProvider.java index d48c542..a4a1d0d 100755 --- a/fabricmc/src/main/java/net/cmr/jurassicrevived/datagen/FabricModModelProvider.java +++ b/fabricmc/src/main/java/net/cmr/jurassicrevived/datagen/FabricModModelProvider.java @@ -148,6 +148,57 @@ public class FabricModModelProvider extends FabricModelProvider implements ModBl } } + @Override + public void blockWithItem(Block block, ResourceLocation sideTexture, ResourceLocation bottomTexture, ResourceLocation topTexture) { + if (isGeneratingBlocks()) { + TextureMapping mapping = new TextureMapping() + .put(TextureSlot.SIDE, sideTexture) + .put(TextureSlot.BOTTOM, bottomTexture) + .put(TextureSlot.TOP, topTexture); + ResourceLocation modelLocation = ModelTemplates.CUBE_BOTTOM_TOP.create(block, mapping, blockStateGenerator.modelOutput); + blockStateGenerator.blockStateOutput.accept(BlockModelGenerators.createSimpleBlock(block, modelLocation)); + } + if (isGeneratingItems()) { + generateBlockItemModel(block); + } + } + + @Override + public void randomTextureBlockWithItem(Block block, List textures) { + if (textures.isEmpty()) { + throw new IllegalArgumentException("randomTextureBlockWithItem requires at least one texture"); + } + + ResourceLocation baseModel = null; + + if (isGeneratingBlocks()) { + Variant[] variants = new Variant[textures.size()]; + + for (int i = 0; i < textures.size(); i++) { + TextureMapping mapping = new TextureMapping().put(TextureSlot.ALL, textures.get(i)); + ResourceLocation model = ModelTemplates.CUBE_ALL.createWithSuffix(block, "_" + i, mapping, blockStateGenerator.modelOutput); + + if (i == 0) { + baseModel = model; + } + + variants[i] = Variant.variant() + .with(VariantProperties.MODEL, model); + } + + blockStateGenerator.blockStateOutput.accept(MultiVariantGenerator.multiVariant(block, variants)); + } + + if (isGeneratingItems()) { + ResourceLocation itemParent = baseModel != null ? baseModel : ModelLocationUtils.getModelLocation(block, "_0"); + itemModelGenerator.output.accept(ModelLocationUtils.getModelLocation(block.asItem()), () -> { + JsonObject json = new JsonObject(); + json.addProperty("parent", itemParent.toString()); + return json; + }); + } + } + private PropertyDispatch createRotatedHorizontalFacingDispatch() { return PropertyDispatch.property(BlockStateProperties.HORIZONTAL_FACING) .select(Direction.NORTH, Variant.variant().with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)) diff --git a/gradle.properties b/gradle.properties index b019620..293d22c 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.218.0 +mod.version=0.222.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/message.txt b/message.txt new file mode 100644 index 0000000..15b4659 --- /dev/null +++ b/message.txt @@ -0,0 +1,92 @@ +Achillobator – 28800 ticks + Albertosaurus – 67200 ticks + Alligator Gar – 33600 ticks + Allosaurus – 52800 ticks + Alvarezsaurus – 19200 ticks + Ankylosaurus – 86400 ticks + Apatosaurus – 110400 ticks + Arambourgiania – 43200 ticks + Argentavis – 48000 ticks + Baryonyx – 52800 ticks + Beelzebufo – 14400 ticks + Brachiosaurus – 134400 ticks + Carcharodontosaurus – 72000 ticks + Carnotaurus – 43200 ticks + Cearadactylus – 28800 ticks + Ceratosaurus – 38400 ticks + Chasmosaurus – 67200 ticks + Chilesaurus – 38400 ticks + Coelacanth – 38400 ticks + Coelophysis – 19200 ticks + Coelurus – 24000 ticks + Compsognathus – 14400 ticks + Concavenator – 43200 ticks + Corythosaurus – 52800 ticks + Crassigyrinus – 24000 ticks + Deinonychus – 33600 ticks + Dilophosaurus – 33600 ticks + Dimorphodon – 19200 ticks + Diplocaulus – 19200 ticks + Diplodocus – 110400 ticks + Distortus Rex – 62400 ticks + Dodo – 24000 ticks + Dryosaurus – 28800 ticks + Edmontosaurus – 67200 ticks + Gallimimus – 33600 ticks + Geosternbergia – 28800 ticks + Giant Moa – 57600 ticks + Giganotosuarus – 81600 ticks + Guanlong – 33600 ticks + Guidraco – 28800 ticks + Haast Eagle – 43200 ticks + Hadrosaurus – 52800 ticks + Herrerasaurus – 28800 ticks + Hypsilophodon – 24000 ticks + Ichthyornis – 19200 ticks + Indominus Rex – 50400 ticks + Indoraptor – 24000 ticks + Inostrancevia – 33600 ticks + Lambeosaurus – 52800 ticks + Ludodactylus – 24000 ticks + Majungasaurus – 43200 ticks + Mamenchisaurus – 134400 ticks + Mawsonia – 43200 ticks + Metriacanthosaurus – 52800 ticks + Moganopterus – 33600 ticks + Mussaurus – 62400 ticks + Nyctosaurus – 24000 ticks + Ornitholestes – 24000 ticks + Ornithomimus – 33600 ticks + Ouranosaurus – 52800 ticks + Oviraptor – 28800 ticks + Pachycephalosaurus – 52800 ticks + Parasaurolophus – 57600 ticks + Pelagornis – 33600 ticks + Proceratosaurus – 33600 ticks + Procompsognathus – 14400 ticks + Protoceratops – 43200 ticks + Pteranodon – 28800 ticks + Pterodaustro – 19200 ticks + Quetzalcoatlus – 43200 ticks + Rajasaurus – 43200 ticks + Rugops – 38400 ticks + Segisaurus – 19200 ticks + Shantungosaurus – 81600 ticks + Spinosaurus – 86400 ticks + Stegosaurus – 52800 ticks + Styracosaurus – 67200 ticks + Suchomimus – 72000 ticks + Tapejara – 24000 ticks + Theriznosarus – 76800 ticks + Thescelosaurus – 43200 ticks + Titanosaurus – 129600 ticks + Triceratops – 91200 ticks + Troodon – 24000 ticks + Tropeognathus – 28800 ticks + Tupuxuara – 28800 ticks + Tyrannosaurus Rex – 91200 ticks + Utahraptor – 43200 ticks + Velociraptor – 28800 ticks + Zhenyuanopterus – 28800 ticks + Fduck - 28800 ticks + Chickenosaurus - 28800 ticks \ No newline at end of file diff --git a/minecraftforge/src/main/java/net/cmr/jurassicrevived/datagen/ForgeBlockLootTableProvider.java b/minecraftforge/src/main/java/net/cmr/jurassicrevived/datagen/ForgeBlockLootTableProvider.java index 5ed93ea..1001b6a 100755 --- a/minecraftforge/src/main/java/net/cmr/jurassicrevived/datagen/ForgeBlockLootTableProvider.java +++ b/minecraftforge/src/main/java/net/cmr/jurassicrevived/datagen/ForgeBlockLootTableProvider.java @@ -8,9 +8,11 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.storage.loot.LootTable; +import net.minecraft.world.level.storage.loot.entries.AlternativesEntry; import net.minecraft.world.level.storage.loot.entries.LootItem; import net.minecraft.world.level.storage.loot.functions.ApplyBonusCount; import net.minecraft.world.level.storage.loot.functions.SetItemCountFunction; +import net.minecraft.world.level.storage.loot.predicates.LootItemRandomChanceCondition; import net.minecraft.world.level.storage.loot.providers.number.UniformGenerator; import java.util.Set; @@ -44,6 +46,20 @@ public class ForgeBlockLootTableProvider extends BlockLootSubProvider implements .apply(ApplyBonusCount.addOreBonusCount(Enchantments.BLOCK_FORTUNE)))); } + @Override + public LootTable.Builder createRandomOreDrops(Block block, Item silkTouchDrop, Item firstDrop, Item secondDrop, float minRolls, float maxRolls, double firstDropChance) { + return this.createSilkTouchDispatchTable(block, + AlternativesEntry.alternatives( + this.applyExplosionDecay(block, + LootItem.lootTableItem(firstDrop) + .when(LootItemRandomChanceCondition.randomChance((float) firstDropChance)) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(minRolls, maxRolls)))), + this.applyExplosionDecay(block, + LootItem.lootTableItem(secondDrop) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(minRolls, maxRolls)))) + )); + } + @Override public LootTable.Builder createPotFlowerItemTable(Block block) { return super.createPotFlowerItemTable(block); diff --git a/minecraftforge/src/main/java/net/cmr/jurassicrevived/datagen/ForgeBlockStateProvider.java b/minecraftforge/src/main/java/net/cmr/jurassicrevived/datagen/ForgeBlockStateProvider.java index cc636a3..8cbd9c7 100755 --- a/minecraftforge/src/main/java/net/cmr/jurassicrevived/datagen/ForgeBlockStateProvider.java +++ b/minecraftforge/src/main/java/net/cmr/jurassicrevived/datagen/ForgeBlockStateProvider.java @@ -13,10 +13,13 @@ import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.block.state.properties.BooleanProperty; import net.minecraft.world.level.block.state.properties.EnumProperty; import net.minecraftforge.client.model.generators.BlockStateProvider; +import net.minecraftforge.client.model.generators.ConfiguredModel; import net.minecraftforge.client.model.generators.ModelFile; import net.minecraftforge.client.model.generators.MultiPartBlockStateBuilder; import net.minecraftforge.common.data.ExistingFileHelper; +import java.util.List; + public class ForgeBlockStateProvider extends BlockStateProvider implements ModBlockStateProvider.BlockStateHelper { public ForgeBlockStateProvider(PackOutput output, ExistingFileHelper exFileHelper) { @@ -65,6 +68,34 @@ public class ForgeBlockStateProvider extends BlockStateProvider implements ModBl super.simpleBlockWithItem(block, models().cubeAll(name(block), blockTexture(block))); } + @Override + public void blockWithItem(Block block, ResourceLocation sideTexture, ResourceLocation bottomTexture, ResourceLocation topTexture) { + super.simpleBlockWithItem(block, models().cubeBottomTop(name(block), sideTexture, bottomTexture, topTexture)); + } + + @Override + public void randomTextureBlockWithItem(Block block, List textures) { + if (textures.isEmpty()) { + throw new IllegalArgumentException("randomTextureBlockWithItem requires at least one texture"); + } + + ConfiguredModel[] configuredModels = new ConfiguredModel[textures.size()]; + + for (int i = 0; i < textures.size(); i++) { + ModelFile model = models().cubeAll(name(block) + "_" + i, textures.get(i)); + configuredModels[i] = ConfiguredModel.builder() + .modelFile(model) + .weight(1) + .buildLast(); + } + + getVariantBuilder(block) + .partialState() + .setModels(configuredModels); + + simpleBlockItem(block, models().cubeAll(name(block) + "_0", textures.get(0))); + } + @Override public void horizontalFacingWithItem(Block block) { ModelFile model = new ModelFile.UncheckedModelFile(modLoc("block/" + name(block))); diff --git a/neoforge/src/main/java/net/cmr/jurassicrevived/datagen/NeoForgeBlockLootTableProvider.java b/neoforge/src/main/java/net/cmr/jurassicrevived/datagen/NeoForgeBlockLootTableProvider.java index 9abf02e..1e953d4 100755 --- a/neoforge/src/main/java/net/cmr/jurassicrevived/datagen/NeoForgeBlockLootTableProvider.java +++ b/neoforge/src/main/java/net/cmr/jurassicrevived/datagen/NeoForgeBlockLootTableProvider.java @@ -10,9 +10,11 @@ import net.minecraft.world.item.enchantment.Enchantment; import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.storage.loot.LootTable; +import net.minecraft.world.level.storage.loot.entries.AlternativesEntry; import net.minecraft.world.level.storage.loot.entries.LootItem; import net.minecraft.world.level.storage.loot.functions.ApplyBonusCount; import net.minecraft.world.level.storage.loot.functions.SetItemCountFunction; +import net.minecraft.world.level.storage.loot.predicates.LootItemRandomChanceCondition; import net.minecraft.world.level.storage.loot.providers.number.UniformGenerator; import java.util.Set; @@ -47,6 +49,20 @@ public class NeoForgeBlockLootTableProvider extends BlockLootSubProvider impleme .apply(ApplyBonusCount.addOreBonusCount(registrylookup.getOrThrow(Enchantments.FORTUNE))))); } + @Override + public LootTable.Builder createRandomOreDrops(Block block, Item silkTouchDrop, Item firstDrop, Item secondDrop, float minRolls, float maxRolls, double firstDropChance) { + return this.createSilkTouchDispatchTable(block, + AlternativesEntry.alternatives( + this.applyExplosionDecay(block, + LootItem.lootTableItem(firstDrop) + .when(LootItemRandomChanceCondition.randomChance((float) firstDropChance)) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(minRolls, maxRolls)))), + this.applyExplosionDecay(block, + LootItem.lootTableItem(secondDrop) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(minRolls, maxRolls)))) + )); + } + @Override public LootTable.Builder createPotFlowerItemTable(Block block) { return super.createPotFlowerItemTable(block); diff --git a/neoforge/src/main/java/net/cmr/jurassicrevived/datagen/NeoForgeBlockStateProvider.java b/neoforge/src/main/java/net/cmr/jurassicrevived/datagen/NeoForgeBlockStateProvider.java index bdf209d..23a1e7a 100755 --- a/neoforge/src/main/java/net/cmr/jurassicrevived/datagen/NeoForgeBlockStateProvider.java +++ b/neoforge/src/main/java/net/cmr/jurassicrevived/datagen/NeoForgeBlockStateProvider.java @@ -13,10 +13,13 @@ import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.block.state.properties.BooleanProperty; import net.minecraft.world.level.block.state.properties.EnumProperty; import net.neoforged.neoforge.client.model.generators.BlockStateProvider; +import net.neoforged.neoforge.client.model.generators.ConfiguredModel; import net.neoforged.neoforge.client.model.generators.ModelFile; import net.neoforged.neoforge.client.model.generators.MultiPartBlockStateBuilder; import net.neoforged.neoforge.common.data.ExistingFileHelper; +import java.util.List; + public class NeoForgeBlockStateProvider extends BlockStateProvider implements ModBlockStateProvider.BlockStateHelper { public NeoForgeBlockStateProvider(PackOutput output, ExistingFileHelper exFileHelper) { @@ -65,6 +68,34 @@ public class NeoForgeBlockStateProvider extends BlockStateProvider implements Mo super.simpleBlockWithItem(block, models().cubeAll(name(block), blockTexture(block))); } + @Override + public void blockWithItem(Block block, ResourceLocation sideTexture, ResourceLocation bottomTexture, ResourceLocation topTexture) { + super.simpleBlockWithItem(block, models().cubeBottomTop(name(block), sideTexture, bottomTexture, topTexture)); + } + + @Override + public void randomTextureBlockWithItem(Block block, List textures) { + if (textures.isEmpty()) { + throw new IllegalArgumentException("randomTextureBlockWithItem requires at least one texture"); + } + + ConfiguredModel[] configuredModels = new ConfiguredModel[textures.size()]; + + for (int i = 0; i < textures.size(); i++) { + ModelFile model = models().cubeAll(name(block) + "_" + i, textures.get(i)); + configuredModels[i] = ConfiguredModel.builder() + .modelFile(model) + .weight(1) + .buildLast(); + } + + getVariantBuilder(block) + .partialState() + .setModels(configuredModels); + + simpleBlockItem(block, models().cubeAll(name(block) + "_0", textures.get(0))); + } + @Override public void horizontalFacingWithItem(Block block) { ModelFile model = new ModelFile.UncheckedModelFile(modLoc("block/" + name(block)));