Skip to content

Commit

Permalink
shrimp behavior
Browse files Browse the repository at this point in the history
  • Loading branch information
TropheusJ committed Apr 2, 2024
1 parent cdfa223 commit 2775b3e
Show file tree
Hide file tree
Showing 11 changed files with 364 additions and 33 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,22 +19,20 @@
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;

import org.slf4j.Logger;
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<ShrimpEntity> 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<ShrimpArrowEntity> SHRIMP_ARROW_TYPE = FabricEntityTypeBuilder.create()
Expand All @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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);
}
}
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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<Optional<BlockPos>> WORKSTATION = SynchedEntityData.defineId(ShrimpEntity.class, EntityDataSerializers.OPTIONAL_BLOCK_POS);

public class ShrimpEntity extends AbstractVillager {
public ShrimpEntity(EntityType<? extends ShrimpEntity> 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);
}
}
Original file line number Diff line number Diff line change
@@ -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<T extends Entity> extends HierarchicalModel<T> {
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);
}
}
Loading

0 comments on commit 2775b3e

Please sign in to comment.