From f14d693436060cf6ec102c56bbcc9cf0c3a401df Mon Sep 17 00:00:00 2001 From: walrus Date: Sat, 25 Jan 2025 16:27:13 -0500 Subject: [PATCH] [CustomEntity] Entity stuff --- .../keeblarcraft/KeeblarcraftClient.java | 11 + .../keeblarcraft/entity/ModModelsLayers.java | 12 + .../entity/PorcupineRenderer.java | 34 ++ .../entity/animation/ModAnimations.java | 464 ++++++++++++++++++ .../entity/model/PorcupineModel.java | 192 ++++++++ .../AttributeMgr/AttributeMgr.java | 3 + .../java/jesse/keeblarcraft/Keeblarcraft.java | 10 + .../datagen/KeeblarModelProvider.java | 8 +- .../entity/MAKE_ENTITY_REGISTER.java | 16 + .../keeblarcraft/entity/PorcupineEntity.java | 114 +++++ .../keeblarcraft/entity/SpawnEggItems.java | 15 + .../assets/keeblarcraft/lang/en_us.json | 3 + .../models/item/porcupine_spawn_egg.json | 3 + .../textures/entity/porcupine.png | Bin 0 -> 995 bytes 14 files changed, 884 insertions(+), 1 deletion(-) create mode 100644 src/client/java/jesse/keeblarcraft/entity/ModModelsLayers.java create mode 100644 src/client/java/jesse/keeblarcraft/entity/PorcupineRenderer.java create mode 100644 src/client/java/jesse/keeblarcraft/entity/animation/ModAnimations.java create mode 100644 src/client/java/jesse/keeblarcraft/entity/model/PorcupineModel.java create mode 100644 src/main/java/jesse/keeblarcraft/entity/MAKE_ENTITY_REGISTER.java create mode 100644 src/main/java/jesse/keeblarcraft/entity/PorcupineEntity.java create mode 100644 src/main/java/jesse/keeblarcraft/entity/SpawnEggItems.java create mode 100644 src/main/resources/assets/keeblarcraft/models/item/porcupine_spawn_egg.json create mode 100644 src/main/resources/assets/keeblarcraft/textures/entity/porcupine.png diff --git a/src/client/java/jesse/keeblarcraft/KeeblarcraftClient.java b/src/client/java/jesse/keeblarcraft/KeeblarcraftClient.java index 0ba3dbc..1f14e12 100644 --- a/src/client/java/jesse/keeblarcraft/KeeblarcraftClient.java +++ b/src/client/java/jesse/keeblarcraft/KeeblarcraftClient.java @@ -4,7 +4,14 @@ import jesse.keeblarcraft.gui.ClientHandlers; // import jesse.keeblarcraft.gui.ScreenManager; // import jesse.keeblarcraft.gui.widgets.TreeWidget; import jesse.keeblarcraft.Shortcuts.ShortcutManager; +import jesse.keeblarcraft.entity.MAKE_ENTITY_REGISTER; +import jesse.keeblarcraft.entity.ModModelsLayers; +import jesse.keeblarcraft.entity.PorcupineRenderer; +import jesse.keeblarcraft.entity.model.PorcupineModel; import net.fabricmc.api.ClientModInitializer; +import net.fabricmc.fabric.api.client.rendering.v1.EntityModelLayerRegistry; +import net.fabricmc.fabric.api.client.rendering.v1.EntityRendererRegistry; + public class KeeblarcraftClient implements ClientModInitializer { @@ -16,6 +23,10 @@ public class KeeblarcraftClient implements ClientModInitializer { // ScreenManager.GetInstance(); // ScreenManager.AddWidget(TreeWidget.class, 10); + + //Temp Client side Model rendering + EntityRendererRegistry.register(MAKE_ENTITY_REGISTER.PORCUPINE, PorcupineRenderer::new); + EntityModelLayerRegistry.registerModelLayer(ModModelsLayers.PORCUPINE, PorcupineModel::getTexturedModelData); } } diff --git a/src/client/java/jesse/keeblarcraft/entity/ModModelsLayers.java b/src/client/java/jesse/keeblarcraft/entity/ModModelsLayers.java new file mode 100644 index 0000000..7ef332d --- /dev/null +++ b/src/client/java/jesse/keeblarcraft/entity/ModModelsLayers.java @@ -0,0 +1,12 @@ +package jesse.keeblarcraft.entity; + +import jesse.keeblarcraft.Keeblarcraft; +import net.minecraft.client.render.entity.model.EntityModelLayer; +import net.minecraft.util.Identifier; + +//for registering the final model layers +public class ModModelsLayers { + public static final EntityModelLayer PORCUPINE = + new EntityModelLayer(new Identifier(Keeblarcraft.MOD_ID + "porcupine"), "main"); + +} diff --git a/src/client/java/jesse/keeblarcraft/entity/PorcupineRenderer.java b/src/client/java/jesse/keeblarcraft/entity/PorcupineRenderer.java new file mode 100644 index 0000000..13c1585 --- /dev/null +++ b/src/client/java/jesse/keeblarcraft/entity/PorcupineRenderer.java @@ -0,0 +1,34 @@ +package jesse.keeblarcraft.entity; + +import jesse.keeblarcraft.Keeblarcraft; +import jesse.keeblarcraft.entity.model.PorcupineModel; +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.entity.EntityRendererFactory; +import net.minecraft.client.render.entity.MobEntityRenderer; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.util.Identifier; + +public class PorcupineRenderer extends MobEntityRenderer> { + // private static final Identifier TEXTURE = + // new Identifier(Keeblarcraft.MOD_ID + "src/main/resources/assets/keeblarcraft/textures/entity/porcupine.png"); + + public PorcupineRenderer(EntityRendererFactory.Context context) { + super(context, new PorcupineModel<>(context.getPart(ModModelsLayers.PORCUPINE)), (float) .6); //.6 is the shadows size of entity + } + + @Override + public Identifier getTexture(PorcupineEntity entity) { + return new Identifier(Keeblarcraft.MOD_ID, "textures/entity/porcupine.png"); + } + + @Override + public void render(PorcupineEntity mobEntity, float f, float g, MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i) { + if (mobEntity.isBaby()) { + matrixStack.scale((float).5,(float) .5,(float) 1); + } else { + matrixStack.scale((float)2,(float) 2,(float) 2); + } + super.render(mobEntity, f, g, matrixStack, vertexConsumerProvider, i); + } +} + diff --git a/src/client/java/jesse/keeblarcraft/entity/animation/ModAnimations.java b/src/client/java/jesse/keeblarcraft/entity/animation/ModAnimations.java new file mode 100644 index 0000000..804aaeb --- /dev/null +++ b/src/client/java/jesse/keeblarcraft/entity/animation/ModAnimations.java @@ -0,0 +1,464 @@ +package jesse.keeblarcraft.entity.animation; + +import net.minecraft.client.render.entity.animation.Animation; +import net.minecraft.client.render.entity.animation.AnimationHelper; +import net.minecraft.client.render.entity.animation.Keyframe; +import net.minecraft.client.render.entity.animation.Transformation; + +public class ModAnimations { + +public static final Animation PORCUPINE_WALK = Animation.Builder.create(2.5f).looping() +.addBoneAnimation("torso", + new Transformation(Transformation.Targets.TRANSLATE, + new Keyframe(0f, AnimationHelper.createTranslationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(0.4167667f, AnimationHelper.createTranslationalVector(0f, 0f, -0.15f), + Transformation.Interpolations.LINEAR), + new Keyframe(0.9583434f, AnimationHelper.createTranslationalVector(0f, 0f, -0.05f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.5f, AnimationHelper.createTranslationalVector(0f, 0f, 0.05f), + Transformation.Interpolations.LINEAR), + new Keyframe(2.125f, AnimationHelper.createTranslationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR))) +.addBoneAnimation("left_front_leg", + new Transformation(Transformation.Targets.ROTATE, + new Keyframe(0.75f, AnimationHelper.createRotationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.0834333f, AnimationHelper.createRotationalVector(-7.5f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.625f, AnimationHelper.createRotationalVector(-11f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(2.0834335f, AnimationHelper.createRotationalVector(-7.5f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(2.5f, AnimationHelper.createRotationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR))) +.addBoneAnimation("right_front_leg", + new Transformation(Transformation.Targets.ROTATE, + new Keyframe(0.20834334f, AnimationHelper.createRotationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(0.5416766f, AnimationHelper.createRotationalVector(-7.5f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.0834333f, AnimationHelper.createRotationalVector(-11f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.2916767f, AnimationHelper.createRotationalVector(-7.5f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.875f, AnimationHelper.createRotationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR))) +.addBoneAnimation("right_back_leg", + new Transformation(Transformation.Targets.ROTATE, + new Keyframe(1f, AnimationHelper.createRotationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.3433333f, AnimationHelper.createRotationalVector(-7.5f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.875f, AnimationHelper.createRotationalVector(-11f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(2.2916765f, AnimationHelper.createRotationalVector(-7.5f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(2.5f, AnimationHelper.createRotationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR))) +.addBoneAnimation("left_back_leg", + new Transformation(Transformation.Targets.ROTATE, + new Keyframe(0f, AnimationHelper.createRotationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(0.3433333f, AnimationHelper.createRotationalVector(-7.5f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(0.875f, AnimationHelper.createRotationalVector(-11f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.5834333f, AnimationHelper.createRotationalVector(-7.5f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(2.0834335f, AnimationHelper.createRotationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR))).build(); +public static final Animation PORCUPINE_IDLE = Animation.Builder.create(2f).looping() +.addBoneAnimation("torso", + new Transformation(Transformation.Targets.TRANSLATE, + new Keyframe(0f, AnimationHelper.createTranslationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(0.5f, AnimationHelper.createTranslationalVector(0f, 0.35f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(0.875f, AnimationHelper.createTranslationalVector(0f, 0.4f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.25f, AnimationHelper.createTranslationalVector(0f, 0.4f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.5f, AnimationHelper.createTranslationalVector(0f, 0.35f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.875f, AnimationHelper.createTranslationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR))) +.addBoneAnimation("torso", + new Transformation(Transformation.Targets.ROTATE, + new Keyframe(0f, AnimationHelper.createRotationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR))) +.addBoneAnimation("skull", + new Transformation(Transformation.Targets.TRANSLATE, + new Keyframe(0f, AnimationHelper.createTranslationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(0.3433333f, AnimationHelper.createTranslationalVector(0f, 0.1f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.5f, AnimationHelper.createTranslationalVector(0f, 0.2f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.9583433f, AnimationHelper.createTranslationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR))) +.addBoneAnimation("skull", + new Transformation(Transformation.Targets.ROTATE, + new Keyframe(0f, AnimationHelper.createRotationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(0.5f, AnimationHelper.createRotationalVector(2f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(0.75f, AnimationHelper.createRotationalVector(2f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1f, AnimationHelper.createRotationalVector(-2f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.25f, AnimationHelper.createRotationalVector(-2f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.75f, AnimationHelper.createRotationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR))) +.addBoneAnimation("left_front_leg", + new Transformation(Transformation.Targets.TRANSLATE, + new Keyframe(0f, AnimationHelper.createTranslationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(0.7083434f, AnimationHelper.createTranslationalVector(0f, 0.1f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.75f, AnimationHelper.createTranslationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR))) +.addBoneAnimation("right_front_leg", + new Transformation(Transformation.Targets.TRANSLATE, + new Keyframe(0f, AnimationHelper.createTranslationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(0.9167666f, AnimationHelper.createTranslationalVector(0f, 0.1f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.7916767f, AnimationHelper.createTranslationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR))) +.addBoneAnimation("right_back_leg", + new Transformation(Transformation.Targets.TRANSLATE, + new Keyframe(0f, AnimationHelper.createTranslationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.125f, AnimationHelper.createTranslationalVector(0f, 0.1f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.7916767f, AnimationHelper.createTranslationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR))) +.addBoneAnimation("left_back_leg", + new Transformation(Transformation.Targets.TRANSLATE, + new Keyframe(0f, AnimationHelper.createTranslationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.2916767f, AnimationHelper.createTranslationalVector(0f, 0.1f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.9167667f, AnimationHelper.createTranslationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR))).build(); +public static final Animation PORCUPINE_ATTACK = Animation.Builder.create(2f).looping() +.addBoneAnimation("torso", + new Transformation(Transformation.Targets.TRANSLATE, + new Keyframe(0f, AnimationHelper.createTranslationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(0.6766666f, AnimationHelper.createTranslationalVector(0f, -0.5f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1f, AnimationHelper.createTranslationalVector(0f, -0.5f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.0416767f, AnimationHelper.createTranslationalVector(0f, 0.5f, -1f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.25f, AnimationHelper.createTranslationalVector(0f, 0.5f, -1f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.5416767f, AnimationHelper.createTranslationalVector(0f, -0.5f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.875f, AnimationHelper.createTranslationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR))) +.addBoneAnimation("torso", + new Transformation(Transformation.Targets.ROTATE, + new Keyframe(0f, AnimationHelper.createRotationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(0.4167667f, AnimationHelper.createRotationalVector(5f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1f, AnimationHelper.createRotationalVector(5f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.0416767f, AnimationHelper.createRotationalVector(5f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.25f, AnimationHelper.createRotationalVector(5f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.5416767f, AnimationHelper.createRotationalVector(5f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.6766667f, AnimationHelper.createRotationalVector(5f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.875f, AnimationHelper.createRotationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR))) +.addBoneAnimation("skull", + new Transformation(Transformation.Targets.TRANSLATE, + new Keyframe(0f, AnimationHelper.createTranslationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1f, AnimationHelper.createTranslationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.0416767f, AnimationHelper.createTranslationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.25f, AnimationHelper.createTranslationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.5416767f, AnimationHelper.createTranslationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.875f, AnimationHelper.createTranslationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR))) +.addBoneAnimation("skull", + new Transformation(Transformation.Targets.ROTATE, + new Keyframe(0f, AnimationHelper.createRotationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(0.4167667f, AnimationHelper.createRotationalVector(15f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1f, AnimationHelper.createRotationalVector(15f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.0416767f, AnimationHelper.createRotationalVector(15f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.25f, AnimationHelper.createRotationalVector(15f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.5416767f, AnimationHelper.createRotationalVector(15f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.6766667f, AnimationHelper.createRotationalVector(15f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.875f, AnimationHelper.createRotationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR))) +.addBoneAnimation("hair", + new Transformation(Transformation.Targets.SCALE, + new Keyframe(1f, AnimationHelper.createScalingVector(1f, 1f, 1f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.0416767f, AnimationHelper.createScalingVector(1.25f, 1.25f, 1.25f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.25f, AnimationHelper.createScalingVector(1.25f, 1.25f, 1.25f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.5f, AnimationHelper.createScalingVector(1f, 1f, 1f), + Transformation.Interpolations.LINEAR))) +.addBoneAnimation("spikes", + new Transformation(Transformation.Targets.SCALE, + new Keyframe(1f, AnimationHelper.createScalingVector(1f, 1f, 1f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.0416767f, AnimationHelper.createScalingVector(1.15f, 1.15f, 1.15f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.25f, AnimationHelper.createScalingVector(1.15f, 1.15f, 1.15f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.5f, AnimationHelper.createScalingVector(1f, 1f, 1f), + Transformation.Interpolations.LINEAR))) +.addBoneAnimation("spikes2", + new Transformation(Transformation.Targets.SCALE, + new Keyframe(1f, AnimationHelper.createScalingVector(1f, 1f, 1f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.0416767f, AnimationHelper.createScalingVector(1.25f, 1.25f, 1.25f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.25f, AnimationHelper.createScalingVector(1.25f, 1.25f, 1.25f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.5f, AnimationHelper.createScalingVector(1f, 1f, 1f), + Transformation.Interpolations.LINEAR))) +.addBoneAnimation("spikes3", + new Transformation(Transformation.Targets.SCALE, + new Keyframe(1f, AnimationHelper.createScalingVector(1f, 1f, 1f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.0416767f, AnimationHelper.createScalingVector(1.15f, 1.15f, 1.15f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.25f, AnimationHelper.createScalingVector(1.15f, 1.15f, 1.15f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.5f, AnimationHelper.createScalingVector(1f, 1f, 1f), + Transformation.Interpolations.LINEAR))) +.addBoneAnimation("spikes4", + new Transformation(Transformation.Targets.SCALE, + new Keyframe(1f, AnimationHelper.createScalingVector(1f, 1f, 1f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.0416767f, AnimationHelper.createScalingVector(1.15f, 1.15f, 1.15f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.25f, AnimationHelper.createScalingVector(1.15f, 1.15f, 1.15f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.5f, AnimationHelper.createScalingVector(1f, 1f, 1f), + Transformation.Interpolations.LINEAR))) +.addBoneAnimation("spikes5", + new Transformation(Transformation.Targets.SCALE, + new Keyframe(1f, AnimationHelper.createScalingVector(1f, 1f, 1f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.0416767f, AnimationHelper.createScalingVector(1.15f, 1.15f, 1.15f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.25f, AnimationHelper.createScalingVector(1.15f, 1.15f, 1.15f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.5f, AnimationHelper.createScalingVector(1f, 1f, 1f), + Transformation.Interpolations.LINEAR))) +.addBoneAnimation("spikes6", + new Transformation(Transformation.Targets.SCALE, + new Keyframe(1f, AnimationHelper.createScalingVector(1f, 1f, 1f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.0416767f, AnimationHelper.createScalingVector(1.15f, 1.15f, 1.15f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.25f, AnimationHelper.createScalingVector(1.15f, 1.15f, 1.15f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.5f, AnimationHelper.createScalingVector(1f, 1f, 1f), + Transformation.Interpolations.LINEAR))) +.addBoneAnimation("spikes7", + new Transformation(Transformation.Targets.SCALE, + new Keyframe(1f, AnimationHelper.createScalingVector(1f, 1f, 1f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.0416767f, AnimationHelper.createScalingVector(1.15f, 1.15f, 1.15f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.25f, AnimationHelper.createScalingVector(1.15f, 1.15f, 1.15f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.5f, AnimationHelper.createScalingVector(1f, 1f, 1f), + Transformation.Interpolations.LINEAR))) +.addBoneAnimation("spikes8", + new Transformation(Transformation.Targets.SCALE, + new Keyframe(1f, AnimationHelper.createScalingVector(1f, 1f, 1f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.0416767f, AnimationHelper.createScalingVector(1.15f, 1.15f, 1.15f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.25f, AnimationHelper.createScalingVector(1.15f, 1.15f, 1.15f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.5f, AnimationHelper.createScalingVector(1f, 1f, 1f), + Transformation.Interpolations.LINEAR))) +.addBoneAnimation("left_front_leg", + new Transformation(Transformation.Targets.TRANSLATE, + new Keyframe(0f, AnimationHelper.createTranslationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(0.25f, AnimationHelper.createTranslationalVector(0f, -0.25f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1f, AnimationHelper.createTranslationalVector(0f, -0.25f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.5f, AnimationHelper.createTranslationalVector(0f, -0.25f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.75f, AnimationHelper.createTranslationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR))) +.addBoneAnimation("left_front_leg", + new Transformation(Transformation.Targets.ROTATE, + new Keyframe(0f, AnimationHelper.createRotationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(0.25f, AnimationHelper.createRotationalVector(7.5f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1f, AnimationHelper.createRotationalVector(7.5f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.5f, AnimationHelper.createRotationalVector(7.5f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.75f, AnimationHelper.createRotationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR))) +.addBoneAnimation("right_front_leg", + new Transformation(Transformation.Targets.TRANSLATE, + new Keyframe(0f, AnimationHelper.createTranslationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(0.25f, AnimationHelper.createTranslationalVector(0f, -0.25f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1f, AnimationHelper.createTranslationalVector(0f, -0.25f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.5f, AnimationHelper.createTranslationalVector(0f, -0.25f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.75f, AnimationHelper.createTranslationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR))) +.addBoneAnimation("right_front_leg", + new Transformation(Transformation.Targets.ROTATE, + new Keyframe(0f, AnimationHelper.createRotationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(0.25f, AnimationHelper.createRotationalVector(7.5f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1f, AnimationHelper.createRotationalVector(7.5f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.5f, AnimationHelper.createRotationalVector(7.5f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.75f, AnimationHelper.createRotationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR))) +.addBoneAnimation("right_back_leg", + new Transformation(Transformation.Targets.TRANSLATE, + new Keyframe(0f, AnimationHelper.createTranslationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(0.25f, AnimationHelper.createTranslationalVector(0f, -0.5f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1f, AnimationHelper.createTranslationalVector(0f, -0.5f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.5f, AnimationHelper.createTranslationalVector(0f, -0.5f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.75f, AnimationHelper.createTranslationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR))) +.addBoneAnimation("right_back_leg", + new Transformation(Transformation.Targets.ROTATE, + new Keyframe(0f, AnimationHelper.createRotationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(0.25f, AnimationHelper.createRotationalVector(10f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1f, AnimationHelper.createRotationalVector(10f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.5f, AnimationHelper.createRotationalVector(10f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.75f, AnimationHelper.createRotationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR))) +.addBoneAnimation("left_back_leg", + new Transformation(Transformation.Targets.TRANSLATE, + new Keyframe(0f, AnimationHelper.createTranslationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(0.25f, AnimationHelper.createTranslationalVector(0f, -0.5f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1f, AnimationHelper.createTranslationalVector(0f, -0.5f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.5f, AnimationHelper.createTranslationalVector(0f, -0.5f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.75f, AnimationHelper.createTranslationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR))) +.addBoneAnimation("left_back_leg", + new Transformation(Transformation.Targets.ROTATE, + new Keyframe(0f, AnimationHelper.createRotationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(0.25f, AnimationHelper.createRotationalVector(10f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1f, AnimationHelper.createRotationalVector(10f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.5f, AnimationHelper.createRotationalVector(10f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.75f, AnimationHelper.createRotationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR))).build(); +public static final Animation PORCUPINE_SIT = Animation.Builder.create(2f).looping() +.addBoneAnimation("porcupine", + new Transformation(Transformation.Targets.TRANSLATE, + new Keyframe(0f, AnimationHelper.createTranslationalVector(0f, -0.5f, 0f), + Transformation.Interpolations.LINEAR))) +.addBoneAnimation("torso", + new Transformation(Transformation.Targets.TRANSLATE, + new Keyframe(0f, AnimationHelper.createTranslationalVector(0f, -0.3f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(0.4583433f, AnimationHelper.createTranslationalVector(0f, 0.3f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.125f, AnimationHelper.createTranslationalVector(0f, 0.5f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.7916767f, AnimationHelper.createTranslationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(2f, AnimationHelper.createTranslationalVector(0f, -0.3f, 0f), + Transformation.Interpolations.LINEAR))) +.addBoneAnimation("torso", + new Transformation(Transformation.Targets.ROTATE, + new Keyframe(0f, AnimationHelper.createRotationalVector(-15f, 0f, 0f), + Transformation.Interpolations.LINEAR))) +.addBoneAnimation("skull", + new Transformation(Transformation.Targets.ROTATE, + new Keyframe(0f, AnimationHelper.createRotationalVector(17.5f, 0f, 0f), + Transformation.Interpolations.LINEAR))) +.addBoneAnimation("left_front_leg", + new Transformation(Transformation.Targets.TRANSLATE, + new Keyframe(0f, AnimationHelper.createTranslationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1f, AnimationHelper.createTranslationalVector(0f, 0.25f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(2f, AnimationHelper.createTranslationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR))) +.addBoneAnimation("right_front_leg", + new Transformation(Transformation.Targets.TRANSLATE, + new Keyframe(0f, AnimationHelper.createTranslationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1f, AnimationHelper.createTranslationalVector(0f, 0.25f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(2f, AnimationHelper.createTranslationalVector(0f, 0f, 0f), + Transformation.Interpolations.LINEAR))) +.addBoneAnimation("right_back_leg", + new Transformation(Transformation.Targets.TRANSLATE, + new Keyframe(0f, AnimationHelper.createTranslationalVector(0f, -1f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.25f, AnimationHelper.createTranslationalVector(0f, -0.75f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(2f, AnimationHelper.createTranslationalVector(0f, -1f, 0f), + Transformation.Interpolations.LINEAR))) +.addBoneAnimation("right_back_leg", + new Transformation(Transformation.Targets.ROTATE, + new Keyframe(0f, AnimationHelper.createRotationalVector(5f, 0f, 0f), + Transformation.Interpolations.LINEAR))) +.addBoneAnimation("left_back_leg", + new Transformation(Transformation.Targets.TRANSLATE, + new Keyframe(0f, AnimationHelper.createTranslationalVector(0f, -1f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.25f, AnimationHelper.createTranslationalVector(0f, -0.75f, 0f), + Transformation.Interpolations.LINEAR), + new Keyframe(1.9583433f, AnimationHelper.createTranslationalVector(0f, -1f, 0f), + Transformation.Interpolations.LINEAR))) +.addBoneAnimation("left_back_leg", + new Transformation(Transformation.Targets.ROTATE, + new Keyframe(0f, AnimationHelper.createRotationalVector(5f, 0f, 0f), + Transformation.Interpolations.LINEAR))).build(); +} diff --git a/src/client/java/jesse/keeblarcraft/entity/model/PorcupineModel.java b/src/client/java/jesse/keeblarcraft/entity/model/PorcupineModel.java new file mode 100644 index 0000000..74a7f33 --- /dev/null +++ b/src/client/java/jesse/keeblarcraft/entity/model/PorcupineModel.java @@ -0,0 +1,192 @@ +// Made with Blockbench 4.12.2 +// Exported for Minecraft version 1.17+ for Yarn +// Paste this class into your mod and generate all required imports + +package jesse.keeblarcraft.entity.model; + +import jesse.keeblarcraft.entity.PorcupineEntity; +import jesse.keeblarcraft.entity.animation.ModAnimations; +import net.minecraft.client.model.Dilation; +import net.minecraft.client.model.ModelData; +import net.minecraft.client.model.ModelPart; +import net.minecraft.client.model.ModelPartBuilder; +import net.minecraft.client.model.ModelPartData; +import net.minecraft.client.model.ModelTransform; +import net.minecraft.client.model.TexturedModelData; +import net.minecraft.client.render.VertexConsumer; +import net.minecraft.client.render.entity.model.SinglePartEntityModel; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.util.math.MathHelper; + +public class PorcupineModel extends SinglePartEntityModel { + private final ModelPart porcupine; + private final ModelPart head; + + public PorcupineModel(ModelPart root) { + this.porcupine = root.getChild("porcupine"); + this.head = porcupine.getChild("body").getChild("torso").getChild("head"); + } + public static TexturedModelData getTexturedModelData() { + ModelData modelData = new ModelData(); + ModelPartData modelPartData = modelData.getRoot(); + ModelPartData porcupine = modelPartData.addChild("porcupine", ModelPartBuilder.create(), ModelTransform.pivot(0.0F, 24.0F, 0.0F)); + + ModelPartData body = porcupine.addChild("body", ModelPartBuilder.create(), ModelTransform.pivot(0.0F, -4.0F, 0.0F)); + + ModelPartData torso = body.addChild("torso", ModelPartBuilder.create().uv(0, 0).cuboid(-3.0F, -3.0F, -4.0F, 6.0F, 5.0F, 8.0F, new Dilation(0.0F)), ModelTransform.pivot(0.0F, 0.0F, 0.0F)); + + ModelPartData tail = torso.addChild("tail", ModelPartBuilder.create(), ModelTransform.of(0.5F, -1.251F, 4.0F, -0.4363F, 0.0F, 0.0F)); + + ModelPartData cube_r1 = tail.addChild("cube_r1", ModelPartBuilder.create().uv(11, 25).cuboid(-6.0F, -0.499F, -1.0F, 7.0F, 0.0F, 7.0F, new Dilation(0.0F)), ModelTransform.of(0.0F, 0.25F, 0.0F, 0.0F, 0.9599F, 0.0F)); + + ModelPartData cube_r2 = tail.addChild("cube_r2", ModelPartBuilder.create().uv(11, 25).cuboid(-6.0F, 0.001F, -1.0F, 7.0F, 0.0F, 7.0F, new Dilation(0.0F)), ModelTransform.of(0.0F, 0.25F, 0.0F, 0.0F, 0.6109F, 0.0F)); + + ModelPartData head = torso.addChild("head", ModelPartBuilder.create(), ModelTransform.of(0.0F, -1.0F, -4.0F, 0.0F, -0.0436F, 0.0F)); + + ModelPartData skull = head.addChild("skull", ModelPartBuilder.create().uv(0, 13).cuboid(-2.0F, -2.0F, -4.0F, 4.0F, 4.0F, 4.0F, new Dilation(0.0F)) + .uv(0, 14).cuboid(1.1F, -0.75F, -3.25F, 1.0F, 1.0F, 1.0F, new Dilation(0.0F)) + .uv(12, 13).cuboid(1.425F, -0.975F, -3.025F, 1.0F, 1.0F, 1.0F, new Dilation(-0.3F)) + .uv(0, 14).mirrored().cuboid(-2.1F, -0.75F, -3.25F, 1.0F, 1.0F, 1.0F, new Dilation(0.0F)).mirrored(false) + .uv(12, 13).mirrored().cuboid(-2.425F, -0.975F, -3.025F, 1.0F, 1.0F, 1.0F, new Dilation(-0.3F)).mirrored(false) + .uv(16, 18).cuboid(-1.0F, -0.25F, -5.0F, 2.0F, 2.0F, 1.0F, new Dilation(0.0F)), ModelTransform.pivot(0.0F, 0.0F, 0.0F)); + + ModelPartData hair = skull.addChild("hair", ModelPartBuilder.create().uv(0, 16).cuboid(0.0F, -4.0F, 0.0F, 0.0F, 5.0F, 5.0F, new Dilation(0.0F)), ModelTransform.of(0.0F, -1.0F, -4.0F, 0.5236F, 0.0F, 0.0F)); + + ModelPartData cube_r3 = hair.addChild("cube_r3", ModelPartBuilder.create().uv(0, 16).cuboid(0.0F, -4.0F, 0.0F, 0.0F, 5.0F, 5.0F, new Dilation(0.0F)), ModelTransform.of(-0.5F, 0.0F, 0.0F, 0.0F, 0.0F, -0.2618F)); + + ModelPartData cube_r4 = hair.addChild("cube_r4", ModelPartBuilder.create().uv(0, 16).cuboid(0.0F, -4.0F, 0.0F, 0.0F, 5.0F, 5.0F, new Dilation(0.0F)), ModelTransform.of(0.5F, 0.0F, 0.0F, 0.0F, 0.0F, 0.2618F)); + + ModelPartData left_eyelid = skull.addChild("left_eyelid", ModelPartBuilder.create().uv(24, 0).cuboid(0.1F, -1.75F, -7.25F, 2.0F, 2.0F, 2.0F, new Dilation(-0.4F)), ModelTransform.pivot(-0.4F, 0.5F, 3.5F)); + + ModelPartData right_eyelid = skull.addChild("right_eyelid", ModelPartBuilder.create().uv(24, 0).mirrored().cuboid(-2.1F, -1.75F, -7.25F, 2.0F, 2.0F, 2.0F, new Dilation(-0.4F)).mirrored(false), ModelTransform.pivot(0.4F, 0.5F, 3.5F)); + + ModelPartData spikes = torso.addChild("spikes", ModelPartBuilder.create(), ModelTransform.pivot(0.0F, -3.0F, -3.5F)); + + ModelPartData spike = spikes.addChild("spike", ModelPartBuilder.create().uv(20, 0).cuboid(0.0F, -7.0F, 0.0F, 0.0F, 7.0F, 1.0F, new Dilation(0.0F)), ModelTransform.of(0.0F, 0.0F, 0.5F, 0.0F, 0.0F, -0.0436F)); + + ModelPartData spike2 = spikes.addChild("spike2", ModelPartBuilder.create().uv(20, 0).cuboid(0.0F, -7.0F, 0.0F, 0.0F, 7.0F, 1.0F, new Dilation(0.0F)), ModelTransform.of(1.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0873F)); + + ModelPartData spike5 = spikes.addChild("spike5", ModelPartBuilder.create().uv(20, 0).cuboid(0.0F, -7.0F, 0.0F, 0.0F, 7.0F, 1.0F, new Dilation(0.0F)), ModelTransform.of(2.0F, 0.0F, 0.5F, 0.0F, 0.0F, 0.3491F)); + + ModelPartData spike3 = spikes.addChild("spike3", ModelPartBuilder.create().uv(20, 0).cuboid(0.0F, -7.0F, 0.0F, 0.0F, 7.0F, 1.0F, new Dilation(0.0F)), ModelTransform.of(-1.0F, 0.0F, 0.0F, 0.0F, 0.0F, -0.1309F)); + + ModelPartData spike4 = spikes.addChild("spike4", ModelPartBuilder.create().uv(20, 0).cuboid(0.0F, -7.0F, 0.0F, 0.0F, 7.0F, 1.0F, new Dilation(0.0F)), ModelTransform.of(-2.0F, 0.0F, 0.5F, 0.0F, 0.0F, -0.4363F)); + + ModelPartData spikes2 = torso.addChild("spikes2", ModelPartBuilder.create(), ModelTransform.of(0.5F, -3.0F, -2.5F, 0.3054F, 0.0F, 0.0F)); + + ModelPartData spike6 = spikes2.addChild("spike6", ModelPartBuilder.create().uv(20, 0).cuboid(0.0F, -7.0F, 0.0F, 0.0F, 7.0F, 1.0F, new Dilation(0.0F)), ModelTransform.pivot(0.0F, 0.0F, -1.0F)); + + ModelPartData spike7 = spikes2.addChild("spike7", ModelPartBuilder.create().uv(20, 0).cuboid(0.0F, -7.0F, 0.0F, 0.0F, 7.0F, 1.0F, new Dilation(0.0F)), ModelTransform.of(1.0F, 0.0F, -1.5F, 0.0F, 0.0F, 0.2618F)); + + ModelPartData spike8 = spikes2.addChild("spike8", ModelPartBuilder.create().uv(20, 0).cuboid(0.0F, -7.0F, 0.0F, 0.0F, 7.0F, 1.0F, new Dilation(0.0F)), ModelTransform.of(2.0F, 0.0F, -1.0F, 0.0F, 0.0F, 0.4363F)); + + ModelPartData spike9 = spikes2.addChild("spike9", ModelPartBuilder.create().uv(20, 0).cuboid(0.0F, -7.0F, 0.0F, 0.0F, 7.0F, 1.0F, new Dilation(0.0F)), ModelTransform.of(-1.0F, 0.0F, -1.5F, 0.0F, 0.0F, -0.3054F)); + + ModelPartData spike10 = spikes2.addChild("spike10", ModelPartBuilder.create().uv(20, 0).cuboid(0.0F, -7.0F, 0.0F, 0.0F, 7.0F, 1.0F, new Dilation(0.0F)), ModelTransform.of(-2.0F, 0.0F, -1.0F, 0.0F, 0.0F, -0.6545F)); + + ModelPartData spikes3 = torso.addChild("spikes3", ModelPartBuilder.create(), ModelTransform.of(0.5F, -3.0F, -2.5F, -0.1745F, 0.0F, 0.0F)); + + ModelPartData spike11 = spikes3.addChild("spike11", ModelPartBuilder.create().uv(20, 0).cuboid(0.0F, -7.0F, 0.0F, 0.0F, 7.0F, 1.0F, new Dilation(0.0F)), ModelTransform.of(0.0F, 0.0F, 0.5F, 0.0F, 0.0F, 0.1309F)); + + ModelPartData spike12 = spikes3.addChild("spike12", ModelPartBuilder.create().uv(20, 0).cuboid(0.0F, -7.0F, 0.0F, 0.0F, 7.0F, 1.0F, new Dilation(0.0F)), ModelTransform.of(1.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.1309F)); + + ModelPartData spike13 = spikes3.addChild("spike13", ModelPartBuilder.create().uv(20, 0).cuboid(0.0F, -7.0F, 0.0F, 0.0F, 7.0F, 1.0F, new Dilation(0.0F)), ModelTransform.of(2.0F, 0.0F, 0.5F, 0.0F, 0.0F, 0.2618F)); + + ModelPartData spike14 = spikes3.addChild("spike14", ModelPartBuilder.create().uv(20, 0).cuboid(0.0F, -7.0F, 0.0F, 0.0F, 7.0F, 1.0F, new Dilation(0.0F)), ModelTransform.of(-1.0F, 0.0F, 0.0F, 0.0F, 0.0F, -0.0436F)); + + ModelPartData spike15 = spikes3.addChild("spike15", ModelPartBuilder.create().uv(20, 0).cuboid(0.0F, -7.0F, 0.0F, 0.0F, 7.0F, 1.0F, new Dilation(0.0F)), ModelTransform.of(-2.0F, 0.0F, 0.5F, 0.0F, 0.0F, -0.1745F)); + + ModelPartData spikes4 = torso.addChild("spikes4", ModelPartBuilder.create(), ModelTransform.of(0.0F, -3.0F, -2.0F, -0.5672F, 0.0F, 0.0F)); + + ModelPartData spike16 = spikes4.addChild("spike16", ModelPartBuilder.create().uv(20, 0).cuboid(0.0F, -6.0F, 0.0F, 0.0F, 6.0F, 1.0F, new Dilation(0.0F)), ModelTransform.pivot(0.0F, 0.0F, 0.5F)); + + ModelPartData spike17 = spikes4.addChild("spike17", ModelPartBuilder.create().uv(20, 0).cuboid(0.0F, -6.0F, 0.0F, 0.0F, 6.0F, 1.0F, new Dilation(0.0F)), ModelTransform.of(1.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.1745F)); + + ModelPartData spike18 = spikes4.addChild("spike18", ModelPartBuilder.create().uv(20, 0).cuboid(0.0F, -6.0F, 0.0F, 0.0F, 6.0F, 1.0F, new Dilation(0.0F)), ModelTransform.of(2.0F, 0.0F, 0.5F, 0.0F, 0.0F, 0.2182F)); + + ModelPartData spike19 = spikes4.addChild("spike19", ModelPartBuilder.create().uv(20, 0).cuboid(0.0F, -6.0F, 0.0F, 0.0F, 6.0F, 1.0F, new Dilation(0.0F)), ModelTransform.of(-1.0F, 0.0F, 0.0F, 0.0F, 0.0F, -0.0873F)); + + ModelPartData spike20 = spikes4.addChild("spike20", ModelPartBuilder.create().uv(20, 0).cuboid(0.0F, -6.0F, 0.0F, 0.0F, 6.0F, 1.0F, new Dilation(0.0F)), ModelTransform.of(-2.0F, 0.0F, 0.5F, 0.0F, 0.0F, -0.1309F)); + + ModelPartData spikes5 = torso.addChild("spikes5", ModelPartBuilder.create(), ModelTransform.of(0.0F, -3.0F, 0.0F, -0.7854F, 0.0F, 0.0F)); + + ModelPartData spike21 = spikes5.addChild("spike21", ModelPartBuilder.create().uv(20, 0).cuboid(0.0F, -6.0F, 0.0F, 0.0F, 6.0F, 1.0F, new Dilation(0.0F)), ModelTransform.pivot(0.0F, 0.0F, 0.5F)); + + ModelPartData spike22 = spikes5.addChild("spike22", ModelPartBuilder.create().uv(20, 0).cuboid(0.0F, -6.0F, 0.0F, 0.0F, 6.0F, 1.0F, new Dilation(0.0F)), ModelTransform.of(1.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.4363F)); + + ModelPartData spike23 = spikes5.addChild("spike23", ModelPartBuilder.create().uv(20, 0).cuboid(0.0F, -6.0F, 0.0F, 0.0F, 6.0F, 1.0F, new Dilation(0.0F)), ModelTransform.of(2.0F, 0.0F, 0.5F, 0.0F, 0.0F, 0.7854F)); + + ModelPartData spike24 = spikes5.addChild("spike24", ModelPartBuilder.create().uv(20, 0).cuboid(0.0F, -6.0F, 0.0F, 0.0F, 6.0F, 1.0F, new Dilation(0.0F)), ModelTransform.of(-1.0F, 0.0F, 0.0F, 0.0F, 0.0F, -0.2618F)); + + ModelPartData spike25 = spikes5.addChild("spike25", ModelPartBuilder.create().uv(20, 0).cuboid(0.0F, -6.0F, 0.0F, 0.0F, 6.0F, 1.0F, new Dilation(0.0F)), ModelTransform.of(-2.0F, 0.0F, 0.5F, 0.0F, 0.0F, -0.5672F)); + + ModelPartData spikes6 = torso.addChild("spikes6", ModelPartBuilder.create(), ModelTransform.of(0.5F, -3.0F, -0.5F, -0.6545F, 0.0F, 0.0F)); + + ModelPartData spike26 = spikes6.addChild("spike26", ModelPartBuilder.create().uv(20, 0).cuboid(0.0F, -5.0F, 0.0F, 0.0F, 5.0F, 1.0F, new Dilation(0.0F)), ModelTransform.pivot(0.0F, 0.0F, 0.5F)); + + ModelPartData spike27 = spikes6.addChild("spike27", ModelPartBuilder.create().uv(20, 0).cuboid(0.0F, -5.0F, 0.0F, 0.0F, 5.0F, 1.0F, new Dilation(0.0F)), ModelTransform.of(1.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.3491F)); + + ModelPartData spike28 = spikes6.addChild("spike28", ModelPartBuilder.create().uv(20, 0).cuboid(0.0F, -5.0F, 0.0F, 0.0F, 5.0F, 1.0F, new Dilation(0.0F)), ModelTransform.of(2.0F, 0.0F, 0.5F, 0.0F, 0.0F, 0.48F)); + + ModelPartData spike29 = spikes6.addChild("spike29", ModelPartBuilder.create().uv(20, 0).cuboid(0.0F, -5.0F, 0.0F, 0.0F, 5.0F, 1.0F, new Dilation(0.0F)), ModelTransform.of(-1.0F, 0.0F, 0.0F, 0.0F, 0.0F, -0.2182F)); + + ModelPartData spike30 = spikes6.addChild("spike30", ModelPartBuilder.create().uv(20, 0).cuboid(0.0F, -5.0F, 0.0F, 0.0F, 5.0F, 1.0F, new Dilation(0.0F)), ModelTransform.of(-2.0F, 0.0F, 0.5F, 0.0F, 0.0F, -0.48F)); + + ModelPartData spikes7 = torso.addChild("spikes7", ModelPartBuilder.create(), ModelTransform.of(0.5F, -3.0F, 1.5F, -0.9599F, 0.0F, 0.0F)); + + ModelPartData spike31 = spikes7.addChild("spike31", ModelPartBuilder.create().uv(20, 0).cuboid(0.0F, -4.0F, 0.0F, 0.0F, 4.0F, 1.0F, new Dilation(0.0F)), ModelTransform.pivot(0.0F, 0.0F, 0.5F)); + + ModelPartData spike32 = spikes7.addChild("spike32", ModelPartBuilder.create().uv(20, 0).cuboid(0.0F, -4.0F, 0.0F, 0.0F, 4.0F, 1.0F, new Dilation(0.0F)), ModelTransform.of(1.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.1309F)); + + ModelPartData spike33 = spikes7.addChild("spike33", ModelPartBuilder.create().uv(20, 0).cuboid(0.0F, -4.0F, 0.0F, 0.0F, 4.0F, 1.0F, new Dilation(0.0F)), ModelTransform.of(2.0F, 0.0F, 0.5F, 0.0F, 0.0F, 0.3491F)); + + ModelPartData spike34 = spikes7.addChild("spike34", ModelPartBuilder.create().uv(20, 0).cuboid(0.0F, -4.0F, 0.0F, 0.0F, 4.0F, 1.0F, new Dilation(0.0F)), ModelTransform.of(-1.0F, 0.0F, 0.0F, 0.0F, 0.0F, -0.1309F)); + + ModelPartData spike35 = spikes7.addChild("spike35", ModelPartBuilder.create().uv(20, 0).cuboid(0.0F, -4.0F, 0.0F, 0.0F, 4.0F, 1.0F, new Dilation(0.0F)), ModelTransform.of(-2.0F, 0.0F, 0.5F, 0.0F, 0.0F, -0.3054F)); + + ModelPartData spikes8 = torso.addChild("spikes8", ModelPartBuilder.create(), ModelTransform.of(0.0F, -3.0F, 3.0F, -1.0472F, 0.0F, 0.0F)); + + ModelPartData spike36 = spikes8.addChild("spike36", ModelPartBuilder.create().uv(20, 0).cuboid(0.0F, -3.0F, 0.0F, 0.0F, 3.0F, 1.0F, new Dilation(0.0F)), ModelTransform.of(0.0F, 0.0F, 0.5F, 0.0F, 0.0F, -0.1309F)); + + ModelPartData spike37 = spikes8.addChild("spike37", ModelPartBuilder.create().uv(20, 0).cuboid(0.0F, -3.0F, 0.0F, 0.0F, 3.0F, 1.0F, new Dilation(0.0F)), ModelTransform.pivot(1.0F, 0.0F, 0.0F)); + + ModelPartData spike38 = spikes8.addChild("spike38", ModelPartBuilder.create().uv(20, 0).cuboid(0.0F, -3.0F, 0.0F, 0.0F, 3.0F, 1.0F, new Dilation(0.0F)), ModelTransform.of(2.0F, 0.0F, 0.5F, 0.0F, 0.0F, 0.3927F)); + + ModelPartData spike39 = spikes8.addChild("spike39", ModelPartBuilder.create().uv(20, 0).cuboid(0.0F, -3.0F, 0.0F, 0.0F, 3.0F, 1.0F, new Dilation(0.0F)), ModelTransform.pivot(-1.0F, 0.0F, 0.0F)); + + ModelPartData spike40 = spikes8.addChild("spike40", ModelPartBuilder.create().uv(20, 0).cuboid(0.0F, -3.0F, 0.0F, 0.0F, 3.0F, 1.0F, new Dilation(0.0F)), ModelTransform.of(-2.0F, 0.0F, 0.5F, 0.0F, 0.0F, -0.3054F)); + + ModelPartData left_front_leg = body.addChild("left_front_leg", ModelPartBuilder.create().uv(0, 0).cuboid(-1.0F, -1.0F, -1.0F, 2.0F, 5.0F, 2.0F, new Dilation(0.0F)), ModelTransform.pivot(3.0F, 0.0F, -2.5F)); + + ModelPartData right_front_leg = body.addChild("right_front_leg", ModelPartBuilder.create().uv(0, 0).mirrored().cuboid(-1.0F, -1.0F, -1.0F, 2.0F, 5.0F, 2.0F, new Dilation(0.0F)).mirrored(false), ModelTransform.pivot(-3.0F, 0.0F, -2.5F)); + + ModelPartData right_back_leg = body.addChild("right_back_leg", ModelPartBuilder.create().uv(0, 0).mirrored().cuboid(-1.0F, -1.0F, -1.0F, 2.0F, 5.0F, 2.0F, new Dilation(0.0F)).mirrored(false), ModelTransform.pivot(-3.0F, 0.0F, 2.5F)); + + ModelPartData left_back_leg = body.addChild("left_back_leg", ModelPartBuilder.create().uv(0, 0).cuboid(-1.0F, -1.0F, -1.0F, 2.0F, 5.0F, 2.0F, new Dilation(0.0F)), ModelTransform.pivot(3.0F, 0.0F, 2.5F)); + return TexturedModelData.of(modelData, 32, 32); + } + + @Override + public void setAngles(PorcupineEntity entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + this.getPart().traverse().forEach(ModelPart::resetTransform); + setHeadAngles(netHeadYaw, headPitch); + + this.animateMovement(ModAnimations.PORCUPINE_WALK, limbSwing, limbSwingAmount, 2, 2); + this.updateAnimation(entity.idlingAnimationState, ModAnimations.PORCUPINE_IDLE, ageInTicks, 1); + } + + private void setHeadAngles(float headYaw, float headPitch) { + headYaw = MathHelper.clamp(headYaw, -30, 30); + headPitch = MathHelper.clamp(headPitch, -20, 45); + } + + @Override + public void render(MatrixStack matrices, VertexConsumer vertexConsumer, int light, int overlay, float red, float green, float blue, float alpha) { + porcupine.render(matrices, vertexConsumer, light, overlay, red, green, blue, alpha); + } + + @Override + public ModelPart getPart() { + return porcupine; + } +} \ No newline at end of file diff --git a/src/main/java/jesse/keeblarcraft/AttributeMgr/AttributeMgr.java b/src/main/java/jesse/keeblarcraft/AttributeMgr/AttributeMgr.java index 799b40f..cf54cc3 100644 --- a/src/main/java/jesse/keeblarcraft/AttributeMgr/AttributeMgr.java +++ b/src/main/java/jesse/keeblarcraft/AttributeMgr/AttributeMgr.java @@ -151,5 +151,8 @@ public class AttributeMgr { RegisterAttributeClass(FactionBeacon.class); RegisterAttributeClass(FactionFlight.class); RegisterAttributeClass(FactionItemRepair.class); + + + } } diff --git a/src/main/java/jesse/keeblarcraft/Keeblarcraft.java b/src/main/java/jesse/keeblarcraft/Keeblarcraft.java index a180c49..cb6e5df 100644 --- a/src/main/java/jesse/keeblarcraft/Keeblarcraft.java +++ b/src/main/java/jesse/keeblarcraft/Keeblarcraft.java @@ -16,6 +16,7 @@ import net.fabricmc.fabric.api.entity.event.v1.ServerEntityWorldChangeEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerEntityEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents; +import net.fabricmc.fabric.api.object.builder.v1.entity.FabricDefaultAttributeRegistry; import net.kyrptonaught.customportalapi.api.CustomPortalBuilder; import net.minecraft.block.Blocks; import net.minecraft.entity.mob.HostileEntity; @@ -42,6 +43,9 @@ import jesse.keeblarcraft.EventMgr.ServerTickListener; import jesse.keeblarcraft.GuiMgr.ScreenHandlerRegistration; import jesse.keeblarcraft.GuiMgr.TreeHandler; import jesse.keeblarcraft.Utils.CustomExceptions.SETUP_FAILED_EXCEPTION; +import jesse.keeblarcraft.entity.MAKE_ENTITY_REGISTER; +import jesse.keeblarcraft.entity.PorcupineEntity; +import jesse.keeblarcraft.entity.SpawnEggItems; import jesse.keeblarcraft.Utils.Setup; public class Keeblarcraft implements ModInitializer { @@ -147,6 +151,12 @@ public class Keeblarcraft implements ModInitializer { // Screen handlers ScreenHandlerRegistration.registerScreenHandlers(); + //Temp Entity Register + FabricDefaultAttributeRegistry.register(MAKE_ENTITY_REGISTER.PORCUPINE, PorcupineEntity.createPorcupineAttributes()); + + //SpawnEggitems Register + SpawnEggItems.RegisterPorcupineSpawnEgg(); + } catch (SETUP_FAILED_EXCEPTION e) { Keeblarcraft.LOGGER.error("ERROR. Setup failed to initialize environment. Mod likely does not have read/write permissions inside area. Mod will now close out."); diff --git a/src/main/java/jesse/keeblarcraft/datagen/KeeblarModelProvider.java b/src/main/java/jesse/keeblarcraft/datagen/KeeblarModelProvider.java index 9200a53..40f8f7c 100644 --- a/src/main/java/jesse/keeblarcraft/datagen/KeeblarModelProvider.java +++ b/src/main/java/jesse/keeblarcraft/datagen/KeeblarModelProvider.java @@ -1,10 +1,15 @@ package jesse.keeblarcraft.datagen; +import java.util.Optional; + import jesse.keeblarcraft.CustomBlocks.BlockManager; +import jesse.keeblarcraft.entity.SpawnEggItems; import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; import net.fabricmc.fabric.api.datagen.v1.provider.FabricModelProvider; import net.minecraft.data.client.BlockStateModelGenerator; import net.minecraft.data.client.ItemModelGenerator; +import net.minecraft.data.client.Model; +import net.minecraft.util.Identifier; public class KeeblarModelProvider extends FabricModelProvider { @@ -19,7 +24,8 @@ public class KeeblarModelProvider extends FabricModelProvider { @Override public void generateItemModels(ItemModelGenerator itemModelGenerator) { - + itemModelGenerator.register(SpawnEggItems.PORCUPINE_SPAWN_EGG, new Model( + Optional.of(new Identifier("item/template_spawn_egg")), Optional.empty())); } } diff --git a/src/main/java/jesse/keeblarcraft/entity/MAKE_ENTITY_REGISTER.java b/src/main/java/jesse/keeblarcraft/entity/MAKE_ENTITY_REGISTER.java new file mode 100644 index 0000000..1f46f37 --- /dev/null +++ b/src/main/java/jesse/keeblarcraft/entity/MAKE_ENTITY_REGISTER.java @@ -0,0 +1,16 @@ +package jesse.keeblarcraft.entity; + +import jesse.keeblarcraft.Keeblarcraft; +import net.fabricmc.fabric.api.object.builder.v1.entity.FabricEntityTypeBuilder; +import net.minecraft.entity.EntityDimensions; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.SpawnGroup; +import net.minecraft.registry.Registries; +import net.minecraft.registry.Registry; +import net.minecraft.util.Identifier; + +public class MAKE_ENTITY_REGISTER { + public static final EntityType PORCUPINE = Registry.register(Registries.ENTITY_TYPE, + new Identifier(Keeblarcraft.MOD_ID + "porcupine"), + FabricEntityTypeBuilder.create(SpawnGroup.CREATURE, PorcupineEntity::new).dimensions(EntityDimensions.fixed(1, 1)).build()); +} diff --git a/src/main/java/jesse/keeblarcraft/entity/PorcupineEntity.java b/src/main/java/jesse/keeblarcraft/entity/PorcupineEntity.java new file mode 100644 index 0000000..8f71b5e --- /dev/null +++ b/src/main/java/jesse/keeblarcraft/entity/PorcupineEntity.java @@ -0,0 +1,114 @@ +package jesse.keeblarcraft.entity; + +import jesse.keeblarcraft.entity.MAKE_ENTITY_REGISTER; +import net.minecraft.entity.AnimationState; +import net.minecraft.entity.EntityPose; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.ai.goal.AnimalMateGoal; +import net.minecraft.entity.ai.goal.FollowParentGoal; +import net.minecraft.entity.ai.goal.LookAroundGoal; +import net.minecraft.entity.ai.goal.LookAtEntityGoal; +import net.minecraft.entity.ai.goal.SwimGoal; +import net.minecraft.entity.ai.goal.TemptGoal; +import net.minecraft.entity.ai.goal.WanderAroundFarGoal; +import net.minecraft.entity.attribute.DefaultAttributeContainer; +import net.minecraft.entity.attribute.EntityAttributes; +import net.minecraft.entity.damage.DamageSource; +import net.minecraft.entity.mob.MobEntity; +import net.minecraft.entity.passive.AnimalEntity; +import net.minecraft.entity.passive.PassiveEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.recipe.Ingredient; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.sound.SoundEvent; +import net.minecraft.sound.SoundEvents; +import net.minecraft.world.World; + +public class PorcupineEntity extends AnimalEntity { + public final AnimationState idlingAnimationState = new AnimationState(); + private int idleAnimationCooldown = 0; + + public PorcupineEntity (EntityType entityType, World world) { + super(entityType, world); + } + + private void updateAnimations() { + if (this.idleAnimationCooldown <= 0) { + this.idleAnimationCooldown = this.random.nextInt(40) + 80; + this.idlingAnimationState.start(this.age); + } else { + --this.idleAnimationCooldown; + } + } + + protected void updateLimbs(float posDelta) { + float f; + if (this.getPose() == EntityPose.STANDING) { + f = Math.min(posDelta * 6.0F, 1.0F); + } else { + f = 0.0F; + } + + this.limbAnimator.updateLimbs(f, 0.2F); + } + + @Override + public void tick() { + super.tick(); + if (this.getWorld().isClient) { + this.updateAnimations(); + } + } + + + @Override + protected void initGoals() { + this.goalSelector.add(0, new SwimGoal(this)); + + this.goalSelector.add(1, new AnimalMateGoal(this, 5)); + + this.goalSelector.add(2, new TemptGoal(this, 2, Ingredient.ofItems(Items.BEETROOT), false)); + + this.goalSelector.add(3, new FollowParentGoal(this, 3)); + + this.goalSelector.add(4, new WanderAroundFarGoal(this, 2)); + + this.goalSelector.add(5, new LookAtEntityGoal(this, PlayerEntity.class, 10)); + + this.goalSelector.add(5, new LookAtEntityGoal(this, LivingEntity.class, 10)); + + this.goalSelector.add(6, new LookAroundGoal(this)); +} + + public static DefaultAttributeContainer.Builder createPorcupineAttributes() { + return MobEntity.createMobAttributes() + .add(EntityAttributes.GENERIC_MAX_HEALTH, 10) + .add(EntityAttributes.GENERIC_ATTACK_DAMAGE, 1) + .add(EntityAttributes.GENERIC_MOVEMENT_SPEED, .2) + .add(EntityAttributes.GENERIC_ARMOR, 2); + } + + @Override + public boolean isBreedingItem(ItemStack stack) { + return stack.isOf(Items.OAK_LOG); + } + + + @Override + public PassiveEntity createChild(ServerWorld world, PassiveEntity entity) { + return MAKE_ENTITY_REGISTER.PORCUPINE.create(world); + } + + @Override + protected SoundEvent getHurtSound(DamageSource source) { + return SoundEvents.ENTITY_GHAST_HURT; + } + + protected SoundEvent getDeathSound() { + return SoundEvents.ENTITY_CREEPER_DEATH; + } + +} diff --git a/src/main/java/jesse/keeblarcraft/entity/SpawnEggItems.java b/src/main/java/jesse/keeblarcraft/entity/SpawnEggItems.java new file mode 100644 index 0000000..894be91 --- /dev/null +++ b/src/main/java/jesse/keeblarcraft/entity/SpawnEggItems.java @@ -0,0 +1,15 @@ +package jesse.keeblarcraft.entity; + +import jesse.keeblarcraft.CustomItems.ItemManager; +import net.fabricmc.fabric.api.item.v1.FabricItemSettings; +import net.minecraft.item.Item; +import net.minecraft.item.SpawnEggItem; + +public class SpawnEggItems { + //spawn egg + public static final Item PORCUPINE_SPAWN_EGG = new SpawnEggItem(MAKE_ENTITY_REGISTER.PORCUPINE, 0xa54321, 0xa1235, new FabricItemSettings()); + + public static void RegisterPorcupineSpawnEgg() { + ItemManager.RegisterItem("porcupine_spawn_egg", PORCUPINE_SPAWN_EGG); + } +} diff --git a/src/main/resources/assets/keeblarcraft/lang/en_us.json b/src/main/resources/assets/keeblarcraft/lang/en_us.json index ddd3162..689106b 100644 --- a/src/main/resources/assets/keeblarcraft/lang/en_us.json +++ b/src/main/resources/assets/keeblarcraft/lang/en_us.json @@ -3,6 +3,7 @@ "item.keeblarcraft.metaljacket_chestplate": "MetalJacket Chestplate", "item.keeblarcraft.metaljacket_leggings": "MetalJacket Leggings", "item.keeblarcraft.metaljacket_boots": "MetalJacket Booties", + "item.keeblarcraft.porcupine_spawn_egg": "Porcupine_Spawn_Egg", "itemgroup.keeblarcraft": "Keeblarcraft Modded Items", @@ -14,4 +15,6 @@ "category.keeblarcraft.test": "Keeblarcraft bindings", "key.keeblarcraft.treemap": "Tree GUI", "key.keeblarcraft.globalconfig": "Config menu" + + } \ No newline at end of file diff --git a/src/main/resources/assets/keeblarcraft/models/item/porcupine_spawn_egg.json b/src/main/resources/assets/keeblarcraft/models/item/porcupine_spawn_egg.json new file mode 100644 index 0000000..9af9021 --- /dev/null +++ b/src/main/resources/assets/keeblarcraft/models/item/porcupine_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/main/resources/assets/keeblarcraft/textures/entity/porcupine.png b/src/main/resources/assets/keeblarcraft/textures/entity/porcupine.png new file mode 100644 index 0000000000000000000000000000000000000000..18c66e5a4a26964255b4af1ff829df2200b7a5f0 GIT binary patch literal 995 zcmV<9104K`P)Px&ok>JNR9J$3halw8A+U!agt*N(hfzZur`d+Cu>}z-hv`?TuC5+OGJeod-LLBX zs`u5aX2?)qTo3^8seJ+fNG>iI0IbxPgN!sR?2v`z=<2Y@c`p>=Y~ z0ANg=LqG{VT$lZbsWtOWG3VqB@3QY#qJ+}=5$adOlVOCRF8B=o<5qEMkzDCXXnzW;;&bK zm)SGI()Ur13fi7U35W05g&Lr-N#8&RRN5pL7p6JJiY~)qZ4T(CeyI73cphI~!>w4D zs*dBlcLikoe%`x6e0iN)G-w{_iV`lj@9^^%Jej=@-?Q=SKW}q2VF5t1LuqrQ!myj> z3={w3%WL@{s|PaPXHCCWCMO)6_pT5n9G+7}lyKu2VnqqZO2R4AAgubvlHX+^A}?c zNET3<)WteIO$PLLogMFvvhOAAC>#>?#RWlpcPkd&9p#%&>*SQtS$J6-(MukpE0$sUoLhc~CNx8|` zZM$CqLI{!aSbTWBSD@5~*Lx!6ap@gz6tI5#c^zlRZOqKqkn&jAj>`Zb<*|6N^&E|t zFEKM;yDR$`Tix7dGxIf^9k&q%fxOj*K_DGl-P|52_l;PoFN>XxHIedIq&yZo8*5^v zzISTDB*aszmG5o5C#F>?C+P}`%FlAES+tK2Vz*+$j}ZC#LmW=AcHi%Nmkx< zZi$+|#Ii_*?YJz9RIF}pvq7?vIRF5p{Oq_bYW@;i|LK{yNj5SE+Tnrl9?V0H@Z(Vn z^~D9z*lnOpHa3Lrp-}Ue*o&>_Xom;l_g}W~@u($>c#!N)_^ozWXuoH=>??JAf**2# Ri$wqc002ovPDHLkV1giw*W>^I literal 0 HcmV?d00001