diff --git a/src/main/java/io/github/tropheusj/its_as_shrimple_as_that/ItsAsShrimpleAsThat.java b/src/main/java/io/github/tropheusj/its_as_shrimple_as_that/ItsAsShrimpleAsThat.java index 287a216..7bd8302 100644 --- a/src/main/java/io/github/tropheusj/its_as_shrimple_as_that/ItsAsShrimpleAsThat.java +++ b/src/main/java/io/github/tropheusj/its_as_shrimple_as_that/ItsAsShrimpleAsThat.java @@ -19,8 +19,6 @@ import net.minecraft.world.entity.MobCategory; import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.entity.ai.attributes.Attributes; -import net.minecraft.world.entity.ai.attributes.DefaultAttributes; -import net.minecraft.world.entity.npc.Villager; import net.minecraft.world.item.ArrowItem; import net.minecraft.world.item.Item; @@ -28,13 +26,13 @@ import org.slf4j.LoggerFactory; public class ItsAsShrimpleAsThat implements ModInitializer { - public static final String ID = "krill"; + public static final String ID = "its_as_shrimple_as_that"; public static final Logger LOGGER = LoggerFactory.getLogger(ID); public static final EntityType SHRIMP_TYPE = FabricEntityTypeBuilder.create() .entityFactory(ShrimpEntity::new) .spawnGroup(MobCategory.WATER_AMBIENT) - .dimensions(EntityDimensions.fixed(0.5f, 0.5f)) + .dimensions(EntityDimensions.fixed(0.9f, 0.5f)) .build(); public static final EntityType SHRIMP_ARROW_TYPE = FabricEntityTypeBuilder.create() @@ -60,7 +58,7 @@ public void onInitialize() { (dispatcher, registryAccess, environment) -> dispatcher.register(KrillCommand.build()) ); - FabricDefaultAttributeRegistry.register(SHRIMP_TYPE, Villager.createAttributes().build()); + FabricDefaultAttributeRegistry.register(SHRIMP_TYPE, ShrimpEntity.createAttributes().build()); } public static ResourceLocation id(String path) { diff --git a/src/main/java/io/github/tropheusj/its_as_shrimple_as_that/ItsAsShrimpleAsThatClient.java b/src/main/java/io/github/tropheusj/its_as_shrimple_as_that/ItsAsShrimpleAsThatClient.java index 337951a..99c35bd 100644 --- a/src/main/java/io/github/tropheusj/its_as_shrimple_as_that/ItsAsShrimpleAsThatClient.java +++ b/src/main/java/io/github/tropheusj/its_as_shrimple_as_that/ItsAsShrimpleAsThatClient.java @@ -1,6 +1,9 @@ package io.github.tropheusj.its_as_shrimple_as_that; +import io.github.tropheusj.its_as_shrimple_as_that.entity.render.ShrimpModel; +import io.github.tropheusj.its_as_shrimple_as_that.entity.render.ShrimpRenderer; import net.fabricmc.api.ClientModInitializer; +import net.fabricmc.fabric.api.client.rendering.v1.EntityModelLayerRegistry; import net.fabricmc.fabric.api.client.rendering.v1.EntityRendererRegistry; import net.minecraft.client.renderer.entity.NoopRenderer; import net.minecraft.client.renderer.item.ItemProperties; @@ -16,7 +19,9 @@ public void onInitializeClient() { return projectiles != null && projectiles.contains(Items.FIREWORK_ROCKET) ? 1 : 0; }); - EntityRendererRegistry.register(ItsAsShrimpleAsThat.SHRIMP_TYPE, NoopRenderer::new); + EntityModelLayerRegistry.registerModelLayer(ShrimpModel.LAYER_LOCATION, ShrimpModel::createBodyLayer); + + EntityRendererRegistry.register(ItsAsShrimpleAsThat.SHRIMP_TYPE, ShrimpRenderer::new); EntityRendererRegistry.register(ItsAsShrimpleAsThat.SHRIMP_ARROW_TYPE, NoopRenderer::new); } } diff --git a/src/main/java/io/github/tropheusj/its_as_shrimple_as_that/entity/FollowDreamsGoal.java b/src/main/java/io/github/tropheusj/its_as_shrimple_as_that/entity/FollowDreamsGoal.java new file mode 100644 index 0000000..fef1108 --- /dev/null +++ b/src/main/java/io/github/tropheusj/its_as_shrimple_as_that/entity/FollowDreamsGoal.java @@ -0,0 +1,71 @@ +package io.github.tropheusj.its_as_shrimple_as_that.entity; + +import org.jetbrains.annotations.NotNull; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Direction.Plane; +import net.minecraft.world.entity.PathfinderMob; +import net.minecraft.world.entity.ai.goal.MoveToBlockGoal; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Blocks; + +public class FollowDreamsGoal extends MoveToBlockGoal { + private final ShrimpEntity shrimp; + + public FollowDreamsGoal(ShrimpEntity shrimp, double speed, int range, int verticalRange) { + super(shrimp, speed, range, verticalRange); + this.shrimp = shrimp; + } + + @Override + public void start() { + super.start(); + this.shrimp.crushDreams(); + } + + @Override + public void stop() { + super.stop(); + this.shrimp.crushDreams(); + } + + @Override + protected int nextStartTick(PathfinderMob pathfinderMob) { + return 40; + } + + @Override + public void tick() { + super.tick(); + + if (this.isReachedTarget()) { + shrimp.becomeChef(this.blockPos); + } else { + shrimp.crushDreams(); + } + } + + @Override + protected boolean isValidTarget(LevelReader level, BlockPos pos) { + if (!level.isEmptyBlock(pos)) + return false; + for (Direction direction : Plane.HORIZONTAL) { + BlockPos adjacent = pos.relative(direction); + if (level.getBlockState(adjacent).is(Blocks.FRYING_TABLE)) + return true; + } + return false; + } + + @Override + @NotNull + protected BlockPos getMoveToTarget() { + return this.blockPos; + } + + @Override + public double acceptedDistance() { + return 2; + } +} diff --git a/src/main/java/io/github/tropheusj/its_as_shrimple_as_that/entity/ShrimpEntity.java b/src/main/java/io/github/tropheusj/its_as_shrimple_as_that/entity/ShrimpEntity.java index a45246e..eb5de23 100644 --- a/src/main/java/io/github/tropheusj/its_as_shrimple_as_that/entity/ShrimpEntity.java +++ b/src/main/java/io/github/tropheusj/its_as_shrimple_as_that/entity/ShrimpEntity.java @@ -1,45 +1,53 @@ package io.github.tropheusj.its_as_shrimple_as_that.entity; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.entity.AgeableMob; +import java.util.Optional; + +import net.minecraft.core.BlockPos; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.network.syncher.SynchedEntityData.Builder; import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.ExperienceOrb; -import net.minecraft.world.entity.npc.AbstractVillager; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; -import net.minecraft.world.item.trading.ItemCost; -import net.minecraft.world.item.trading.MerchantOffer; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.PathfinderMob; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; -import org.jetbrains.annotations.Nullable; +public class ShrimpEntity extends PathfinderMob { + public static final EntityDataAccessor> WORKSTATION = SynchedEntityData.defineId(ShrimpEntity.class, EntityDataSerializers.OPTIONAL_BLOCK_POS); -public class ShrimpEntity extends AbstractVillager { public ShrimpEntity(EntityType type, Level level) { super(type, level); } @Override - protected void rewardTradeXp(MerchantOffer merchantOffer) { - if (merchantOffer.shouldRewardExp()) { - int i = 3 + this.random.nextInt(4); - this.level().addFreshEntity(new ExperienceOrb( - this.level(), this.getX(), this.getY() + 0.5, this.getZ(), i - )); - } + protected void defineSynchedData(Builder builder) { + super.defineSynchedData(builder); + builder.define(WORKSTATION, Optional.empty()); } @Override - protected void updateTrades() { - this.getOffers().add(new MerchantOffer( - new ItemCost(Items.AMBER_GEM), - new ItemStack(Items.POISONOUS_POTATO_FRIES), - 7, 1, 1 - )); + protected void registerGoals() { + this.goalSelector.addGoal(1, new FollowDreamsGoal(this, 1, 16, 2)); + this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 10, 0.1f)); } - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel serverLevel, AgeableMob ageableMob) { - return null; + public void becomeChef(BlockPos workstation) { + this.entityData.set(WORKSTATION, Optional.of(workstation)); + } + + public void crushDreams() { + this.entityData.set(WORKSTATION,Optional.empty()); + } + + public boolean isChef() { + return this.entityData.get(WORKSTATION).isPresent(); + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 8); } } diff --git a/src/main/java/io/github/tropheusj/its_as_shrimple_as_that/entity/render/ShrimpModel.java b/src/main/java/io/github/tropheusj/its_as_shrimple_as_that/entity/render/ShrimpModel.java new file mode 100644 index 0000000..bd6277a --- /dev/null +++ b/src/main/java/io/github/tropheusj/its_as_shrimple_as_that/entity/render/ShrimpModel.java @@ -0,0 +1,91 @@ +package io.github.tropheusj.its_as_shrimple_as_that.entity.render; + +import org.jetbrains.annotations.NotNull; + +import io.github.tropheusj.its_as_shrimple_as_that.ItsAsShrimpleAsThat; +import net.minecraft.client.model.HierarchicalModel; +import net.minecraft.client.model.geom.ModelLayerLocation; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeDeformation; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.world.entity.Entity; + +public class ShrimpModel extends HierarchicalModel { + public static final ModelLayerLocation LAYER_LOCATION = new ModelLayerLocation(ItsAsShrimpleAsThat.id("shrimp"), "main"); + + private final ModelPart root; + + public ShrimpModel(EntityRendererProvider.Context ctx) { + this.root = ctx.bakeLayer(LAYER_LOCATION); + } + + @Override + @NotNull + public ModelPart root() { + return this.root; + } + + public static LayerDefinition createBodyLayer() { + MeshDefinition meshdefinition = new MeshDefinition(); + PartDefinition partdefinition = meshdefinition.getRoot(); + + PartDefinition mid_segment = partdefinition.addOrReplaceChild("mid_segment", CubeListBuilder.create().texOffs(0, 7).addBox(-1.0F, -2.5F, -2.5F, 3.0F, 2.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.5F, 23.0F, -2.5F, -3.1416F, 0.0F, 3.1416F)); + + PartDefinition r3 = mid_segment.addOrReplaceChild("r3", CubeListBuilder.create().texOffs(0, 21).addBox(-0.5F, 0.0F, 0.0F, 3.0F, 2.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offset(2.0F, -1.0F, -2.0F)); + + PartDefinition r2 = mid_segment.addOrReplaceChild("r2", CubeListBuilder.create().texOffs(0, 21).addBox(-0.5F, 0.0F, 0.0F, 3.0F, 2.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offset(2.0F, -1.0F, -0.5F)); + + PartDefinition r1 = mid_segment.addOrReplaceChild("r1", CubeListBuilder.create().texOffs(0, 21).addBox(-0.5F, 0.0F, 0.0F, 3.0F, 2.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offset(2.0F, -1.0F, 1.0F)); + + PartDefinition l1 = mid_segment.addOrReplaceChild("l1", CubeListBuilder.create().texOffs(0, 21).mirror().addBox(-2.5F, 0.0F, 0.0F, 3.0F, 2.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offset(-1.0F, -1.0F, 1.0F)); + + PartDefinition l2 = mid_segment.addOrReplaceChild("l2", CubeListBuilder.create().texOffs(0, 21).mirror().addBox(-2.5F, 0.0F, 0.0F, 3.0F, 2.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offset(-1.0F, -1.0F, -0.5F)); + + PartDefinition l3 = mid_segment.addOrReplaceChild("l3", CubeListBuilder.create().texOffs(0, 21).mirror().addBox(-2.5F, 0.0F, 0.0F, 3.0F, 2.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offset(-1.0F, -1.0F, -2.0F)); + + PartDefinition head = partdefinition.addOrReplaceChild("head", CubeListBuilder.create().texOffs(0, 0).addBox(-1.5F, -0.6915F, -0.1392F, 3.0F, 2.0F, 4.0F, new CubeDeformation(0.05F)) + .texOffs(8, 0).addBox(-1.5F, 0.3085F, 3.8608F, 3.0F, 0.0F, 3.0F, new CubeDeformation(0.0F)) + .texOffs(28, 0).addBox(1.0F, -1.1915F, 3.3608F, 1.0F, 1.0F, 1.0F, new CubeDeformation(0.0F)) + .texOffs(28, 0).addBox(-2.0F, -1.1915F, 3.3608F, 1.0F, 1.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 20.9403F, -4.0326F, -2.8362F, 0.0F, 3.1416F)); + + PartDefinition left_antennae_r1 = head.addOrReplaceChild("left_antennae_r1", CubeListBuilder.create().texOffs(7, 10).mirror().addBox(-8.1225F, -2.1451F, -10.9603F, 7.0F, 0.0F, 11.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(0.0F, 2.7391F, 3.4097F, -0.1737F, 0.0076F, 0.1309F)); + + PartDefinition right_antennae_r1 = head.addOrReplaceChild("right_antennae_r1", CubeListBuilder.create().texOffs(7, 10).addBox(1.1225F, -2.1451F, -10.9603F, 7.0F, 0.0F, 11.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 2.7391F, 3.4097F, -0.1737F, -0.0076F, -0.1309F)); + + PartDefinition l_arm_1 = head.addOrReplaceChild("l_arm_1", CubeListBuilder.create(), PartPose.offset(-2.0F, 1.3085F, 0.8608F)); + + PartDefinition arm_r1 = l_arm_1.addOrReplaceChild("arm_r1", CubeListBuilder.create().texOffs(0, 24).mirror().addBox(-4.6682F, -1.4602F, 0.4221F, 5.0F, 3.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, -0.7586F, 0.8667F, -0.6986F)); + + PartDefinition l_arm_2 = head.addOrReplaceChild("l_arm_2", CubeListBuilder.create(), PartPose.offsetAndRotation(-1.0F, 1.6092F, 1.8145F, -0.0183F, 0.3323F, -0.109F)); + + PartDefinition arm_r2 = l_arm_2.addOrReplaceChild("arm_r2", CubeListBuilder.create().texOffs(0, 21).mirror().addBox(-3.6821F, -0.6312F, 0.3491F, 3.0F, 2.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(0.342F, -0.2826F, -0.8962F, -0.7586F, 0.8667F, -0.6986F)); + + PartDefinition r_arm_2 = head.addOrReplaceChild("r_arm_2", CubeListBuilder.create(), PartPose.offsetAndRotation(1.0F, 1.6092F, 1.8145F, -0.0183F, -0.3323F, 0.109F)); + + PartDefinition arm_r3 = r_arm_2.addOrReplaceChild("arm_r3", CubeListBuilder.create().texOffs(0, 21).addBox(0.6821F, -0.6312F, 0.3491F, 3.0F, 2.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-0.342F, -0.2826F, -0.8962F, -0.7586F, -0.8667F, 0.6986F)); + + PartDefinition r_arm_1 = head.addOrReplaceChild("r_arm_1", CubeListBuilder.create(), PartPose.offset(1.0F, 1.3085F, 0.8608F)); + + PartDefinition arm_r4 = r_arm_1.addOrReplaceChild("arm_r4", CubeListBuilder.create().texOffs(0, 24).addBox(0.1639F, -1.5254F, -0.4439F, 5.0F, 3.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, -0.7586F, -0.8667F, 0.6986F)); + + PartDefinition hat = head.addOrReplaceChild("hat", CubeListBuilder.create().texOffs(16, 22).addBox(-2.0F, -5.5F, -2.0F, 4.0F, 6.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, -1.25F, 1.0F)); + + PartDefinition back_segment = partdefinition.addOrReplaceChild("back_segment", CubeListBuilder.create().texOffs(0, 14).addBox(-1.0F, -1.9962F, -3.9128F, 3.0F, 2.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.5F, 22.5F, 0.0F, -3.0543F, 0.0F, 3.1416F)); + + PartDefinition tail = back_segment.addOrReplaceChild("tail", CubeListBuilder.create().texOffs(12, 5).addBox(-1.0F, -0.5F, -3.0F, 2.0F, 1.0F, 3.0F, new CubeDeformation(0.0F)) + .texOffs(17, 3).addBox(-2.5F, 0.0F, -5.5F, 5.0F, 0.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.5F, -0.9962F, -3.9128F, 0.1309F, 0.0F, 0.0F)); + + return LayerDefinition.create(meshdefinition, 32, 32); + } + + @Override + public void setupAnim(T entity, float f, float g, float h, float i, float j) { + this.root().getAllParts().forEach(ModelPart::resetPose); + animateWalk(ShrimpMoveAnimation.WALK, f, g, 2, 2); + } +} diff --git a/src/main/java/io/github/tropheusj/its_as_shrimple_as_that/entity/render/ShrimpMoveAnimation.java b/src/main/java/io/github/tropheusj/its_as_shrimple_as_that/entity/render/ShrimpMoveAnimation.java new file mode 100644 index 0000000..31a3c84 --- /dev/null +++ b/src/main/java/io/github/tropheusj/its_as_shrimple_as_that/entity/render/ShrimpMoveAnimation.java @@ -0,0 +1,96 @@ +package io.github.tropheusj.its_as_shrimple_as_that.entity.render; + +import net.minecraft.client.animation.AnimationChannel; +import net.minecraft.client.animation.AnimationDefinition; +import net.minecraft.client.animation.Keyframe; +import net.minecraft.client.animation.KeyframeAnimations; + +/** + * Made with Blockbench 4.9.4 + * Exported for Minecraft version 1.19 or later with Mojang mappings + * @author Carter + */ +public class ShrimpMoveAnimation { + public static final AnimationDefinition WALK = AnimationDefinition.Builder.withLength(0.24F).looping() + .addAnimation("mid_segment", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.12F, KeyframeAnimations.degreeVec(2.5F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.24F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("r3", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(0.0F, 0.0F, -15.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.12F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.24F, KeyframeAnimations.degreeVec(0.0F, 0.0F, -15.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("r2", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.12F, KeyframeAnimations.degreeVec(0.0F, 0.0F, -15.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.24F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("r1", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(0.0F, 0.0F, -15.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.12F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.24F, KeyframeAnimations.degreeVec(0.0F, 0.0F, -15.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("l1", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.12F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 15.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.24F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("l1", new AnimationChannel(AnimationChannel.Targets.POSITION, + new Keyframe(0.0F, KeyframeAnimations.posVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("l2", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 15.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.12F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.24F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 15.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("l2", new AnimationChannel(AnimationChannel.Targets.POSITION, + new Keyframe(0.0F, KeyframeAnimations.posVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("l3", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.12F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 15.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.24F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("head", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.12F, KeyframeAnimations.degreeVec(5.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.24F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("back_segment", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.12F, KeyframeAnimations.degreeVec(3.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.24F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("tail", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.12F, KeyframeAnimations.degreeVec(4.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.2F, KeyframeAnimations.degreeVec(-7.5F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.24F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("l_arm_1", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.08F, KeyframeAnimations.degreeVec(-5.7812F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.16F, KeyframeAnimations.degreeVec(7.5F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.24F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("r_arm_1", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.08F, KeyframeAnimations.degreeVec(7.5F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.16F, KeyframeAnimations.degreeVec(-5.7812F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.24F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("l_arm_2", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("r_arm_2", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("hat", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.12F, KeyframeAnimations.degreeVec(5.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.24F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .build(); +} diff --git a/src/main/java/io/github/tropheusj/its_as_shrimple_as_that/entity/render/ShrimpRenderer.java b/src/main/java/io/github/tropheusj/its_as_shrimple_as_that/entity/render/ShrimpRenderer.java new file mode 100644 index 0000000..9a69ba9 --- /dev/null +++ b/src/main/java/io/github/tropheusj/its_as_shrimple_as_that/entity/render/ShrimpRenderer.java @@ -0,0 +1,26 @@ +package io.github.tropheusj.its_as_shrimple_as_that.entity.render; + +import io.github.tropheusj.its_as_shrimple_as_that.ItsAsShrimpleAsThat; +import io.github.tropheusj.its_as_shrimple_as_that.entity.ShrimpEntity; + +import org.jetbrains.annotations.NotNull; + +import net.minecraft.client.renderer.entity.EntityRendererProvider.Context; +import net.minecraft.client.renderer.entity.LivingEntityRenderer; +import net.minecraft.resources.ResourceLocation; + +public class ShrimpRenderer extends LivingEntityRenderer> { + public static final ResourceLocation TEXTURE = ItsAsShrimpleAsThat.id("textures/entity/shrimp/shrimp.png"); + public static final ResourceLocation CHEF_TEXTURE = ItsAsShrimpleAsThat.id("textures/entity/shrimp/chef_shrimp.png"); + public static final float SHADOW_RADIUS = 0.5f; + + public ShrimpRenderer(Context context) { + super(context, new ShrimpModel<>(context), SHADOW_RADIUS); + } + + @Override + @NotNull + public ResourceLocation getTextureLocation(ShrimpEntity entity) { + return entity.isChef() ? CHEF_TEXTURE : TEXTURE; + } +} diff --git a/src/main/resources/assets/its_as_shrimple_as_that/lang/en_us.json b/src/main/resources/assets/its_as_shrimple_as_that/lang/en_us.json index 920f17b..d7f84da 100644 --- a/src/main/resources/assets/its_as_shrimple_as_that/lang/en_us.json +++ b/src/main/resources/assets/its_as_shrimple_as_that/lang/en_us.json @@ -1,4 +1,6 @@ { + "entity.its_as_shrimple_as_that.shrimp": "Shrimp", + "commands.krill.success.single": "Krilled %s", "commands.krill.success.multiple": "Krilled %s entities" } diff --git a/src/main/resources/assets/its_as_shrimple_as_that/textures/entity/shrimp/chef_shrimp.png b/src/main/resources/assets/its_as_shrimple_as_that/textures/entity/shrimp/chef_shrimp.png new file mode 100644 index 0000000..05a5844 Binary files /dev/null and b/src/main/resources/assets/its_as_shrimple_as_that/textures/entity/shrimp/chef_shrimp.png differ diff --git a/src/main/resources/assets/its_as_shrimple_as_that/textures/entity/shrimp/shrimp.png b/src/main/resources/assets/its_as_shrimple_as_that/textures/entity/shrimp/shrimp.png new file mode 100644 index 0000000..79708d1 Binary files /dev/null and b/src/main/resources/assets/its_as_shrimple_as_that/textures/entity/shrimp/shrimp.png differ diff --git a/src/main/resources/data/its_as_shrimple_as_that/advancements/its_as_shrimple_as_that.json b/src/main/resources/data/its_as_shrimple_as_that/advancements/its_as_shrimple_as_that.json new file mode 100644 index 0000000..8f058c9 --- /dev/null +++ b/src/main/resources/data/its_as_shrimple_as_that/advancements/its_as_shrimple_as_that.json @@ -0,0 +1,34 @@ +{ + "display": { + "icon": { + "item": "its_as_shrimple_as_that:fried_rice" + }, + "title": "You're telling me a shrimp fried this rice?", + "description": "It couldn't be more true.", + "background": "minecraft:dried_kelp_block", + "frame": "challenge", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "traded": { + "trigger": "minecraft:villager_trade", + "conditions": { + "item": { + "items": [ + "its_as_shrimple_as_that:fried_rice" + ] + } + } + } + }, + "requirements": [ + [ + "traded" + ] + ], + "rewards": { + "experience": 42069 + } +}