generated from TropheusJ/fabric-example-mod
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
11 changed files
with
364 additions
and
33 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
71 changes: 71 additions & 0 deletions
71
src/main/java/io/github/tropheusj/its_as_shrimple_as_that/entity/FollowDreamsGoal.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} | ||
} |
62 changes: 35 additions & 27 deletions
62
src/main/java/io/github/tropheusj/its_as_shrimple_as_that/entity/ShrimpEntity.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | ||
} | ||
} |
91 changes: 91 additions & 0 deletions
91
src/main/java/io/github/tropheusj/its_as_shrimple_as_that/entity/render/ShrimpModel.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | ||
} | ||
} |
Oops, something went wrong.