diff --git a/src/main/java/net/id/paradiselost/client/model/ParadiseLostModelLayers.java b/src/main/java/net/id/paradiselost/client/model/ParadiseLostModelLayers.java index 9984b91f4..cbacc9f9e 100644 --- a/src/main/java/net/id/paradiselost/client/model/ParadiseLostModelLayers.java +++ b/src/main/java/net/id/paradiselost/client/model/ParadiseLostModelLayers.java @@ -28,7 +28,7 @@ public class ParadiseLostModelLayers { public static final EntityModelLayer ENVOY_OUTER_ARMOR = register("envoy", "outer_armor", OUTER_ARMOR_MODEL_DATA); public static final EntityModelLayer MOA = register("moa", "main", MoaModel.getTexturedModelData()); public static final EntityModelLayer PHOENIX_ARMOR = register("phoenix_armor", "main", PhoenixArmorModel.getTexturedModelData()); - public static final EntityModelLayer POPOM = register("popom", "main", EnvoyEntityModel.getTexturedModelData()); + public static final EntityModelLayer POPOM = register("popom", "main", PopomEntityModel.getTexturedModelData()); public static EntityModelLayer register(Identifier id, String layer, TexturedModelData data) { diff --git a/src/main/java/net/id/paradiselost/client/model/entity/PopomEntityModel.java b/src/main/java/net/id/paradiselost/client/model/entity/PopomEntityModel.java new file mode 100644 index 000000000..00df62efb --- /dev/null +++ b/src/main/java/net/id/paradiselost/client/model/entity/PopomEntityModel.java @@ -0,0 +1,107 @@ +package net.id.paradiselost.client.model.entity; + +import com.google.common.collect.ImmutableList; +import net.id.paradiselost.entities.passive.PopomEntity; +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.AnimalModel; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.util.math.MathHelper; + +public class PopomEntityModel extends AnimalModel { + + public int furSize = 0; + + private final ModelPart body0; + private final ModelPart body1; + private final ModelPart body2; + private final ModelPart body3; + private final ModelPart head; + private final ModelPart frleg; + private final ModelPart flleg; + private final ModelPart brleg; + private final ModelPart blleg; + + public PopomEntityModel(ModelPart root) { + super(true, 25.0F, 2.0F, 3.0F, 3.0F, 48.0F); + this.body0 = root.getChild("body0"); + this.body1 = root.getChild("body1"); + this.body2 = root.getChild("body2"); + this.body3 = root.getChild("body3"); + this.head = root.getChild("head"); + this.frleg = root.getChild("frleg"); + this.flleg = root.getChild("flleg"); + this.brleg = root.getChild("brleg"); + this.blleg = root.getChild("blleg"); + } + + public static TexturedModelData getTexturedModelData() { + ModelData ModelData = new ModelData(); + ModelPartData root = ModelData.getRoot(); + + ModelPartData body0 = root.addChild("body0", ModelPartBuilder.create().uv(0, 78).cuboid(-5.0F, -9.0F, -8.0F, 10.0F, 6.0F, 15.0F), ModelTransform.pivot(0.0F, 24.0F, 0.0F)); + + ModelPartData body1 = root.addChild("body1", ModelPartBuilder.create().uv(0, 54).cuboid(-5.5F, -11.0F, -8.0F, 11.0F, 8.0F, 16.0F), ModelTransform.pivot(0.0F, 24.0F, 0.0F)); + + ModelPartData body2 = root.addChild("body2", ModelPartBuilder.create().uv(0, 28).cuboid(-6.0F, -12.0F, -8.0F, 12.0F, 9.0F, 17.0F), ModelTransform.pivot(0.0F, 24.0F, 0.0F)); + + ModelPartData body3 = root.addChild("body3", ModelPartBuilder.create().uv(0, 0).cuboid(-7.0F, -13.0F, -8.0F, 14.0F, 10.0F, 18.0F), ModelTransform.pivot(0.0F, 24.0F, 0.0F)); + + ModelPartData head = root.addChild("head", ModelPartBuilder.create().uv(38, 54).cuboid(-4.0F, -2.0F, -4.0F, 8.0F, 4.0F, 4.0F) + .uv(38, 62).cuboid(-3.0F, -5.0F, -5.0F, 6.0F, 3.0F, 3.0F), ModelTransform.pivot(0.0F, 19.0F, -8.0F)); + + ModelPartData frleg = root.addChild("frleg", ModelPartBuilder.create().uv(0, 116).cuboid(-2.99F, 0.0F, -1.0F, 3.0F, 3.0F, 3.0F), ModelTransform.pivot(-2.0F, 21.0F, -5.0F)); + + ModelPartData flleg = root.addChild("flleg", ModelPartBuilder.create().uv(0, 122).cuboid(-0.01F, 0.0F, -1.0F, 3.0F, 3.0F, 3.0F), ModelTransform.pivot(2.0F, 21.0F, -5.0F)); + + ModelPartData brleg = root.addChild("brleg", ModelPartBuilder.create().uv(12, 116).cuboid(-2.99F, 0.0F, -1.0F, 3.0F, 3.0F, 3.0F), ModelTransform.pivot(-2.0F, 21.0F, 4.0F)); + + ModelPartData blleg = root.addChild("blleg", ModelPartBuilder.create().uv(12, 122).cuboid(-0.01F, 0.0F, -1.0F, 3.0F, 3.0F, 3.0F), ModelTransform.pivot(2.0F, 21.0F, 4.0F)); + + return TexturedModelData.of(ModelData, 64, 128); + } + + @Override + public void render(MatrixStack matrices, VertexConsumer vertices, int light, int overlay, int color) { + super.render(matrices, vertices, light, overlay, color); + if (this.child) { + matrices.push(); + float f = 0.5F; + matrices.scale(f, f, f); + matrices.translate(0.0F, 1.6F, 0.0F); + this.getFurs()[2].render(matrices, vertices, light, overlay, color); + matrices.pop(); + } else { + this.getFurs()[furSize].render(matrices, vertices, light, overlay, color); + } + } + + @Override + protected Iterable getHeadParts() { + return ImmutableList.of(this.head); + } + + @Override + protected Iterable getBodyParts() { + return ImmutableList.of(this.frleg, this.flleg, this.brleg, this.blleg); + } + + protected ModelPart[] getFurs() { + return new ModelPart[]{this.body0, this.body1, this.body2, this.body3}; + } + + @Override + public void setAngles(PopomEntity entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) { + this.head.pitch = headPitch * (float) (Math.PI / 180.0); + this.head.yaw = headYaw * (float) (Math.PI / 180.0); + this.brleg.pitch = MathHelper.cos(limbAngle * 0.6662F) * 1.4F * limbDistance; + this.blleg.pitch = MathHelper.cos(limbAngle * 0.6662F + (float) Math.PI) * 1.4F * limbDistance; + this.frleg.pitch = MathHelper.cos(limbAngle * 0.6662F + (float) Math.PI) * 1.4F * limbDistance; + this.flleg.pitch = MathHelper.cos(limbAngle * 0.6662F) * 1.4F * limbDistance; + } +} diff --git a/src/main/java/net/id/paradiselost/client/rendering/entity/passive/PopomEntityRenderer.java b/src/main/java/net/id/paradiselost/client/rendering/entity/passive/PopomEntityRenderer.java index d284fbca9..1f40e3716 100644 --- a/src/main/java/net/id/paradiselost/client/rendering/entity/passive/PopomEntityRenderer.java +++ b/src/main/java/net/id/paradiselost/client/rendering/entity/passive/PopomEntityRenderer.java @@ -4,22 +4,30 @@ import net.fabricmc.api.Environment; import net.id.paradiselost.ParadiseLost; import net.id.paradiselost.client.model.ParadiseLostModelLayers; +import net.id.paradiselost.client.model.entity.PopomEntityModel; import net.id.paradiselost.entities.passive.PopomEntity; +import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.entity.EntityRendererFactory; -import net.minecraft.client.render.entity.PigEntityRenderer; -import net.id.paradiselost.client.rendering.entity.passive.PopomEntityRenderer; -import net.minecraft.entity.passive.PigEntity; +import net.minecraft.client.render.entity.MobEntityRenderer; +import net.minecraft.client.util.math.MatrixStack; import net.minecraft.util.Identifier; @Environment(EnvType.CLIENT) -public class PopomEntityRenderer extends PigEntityRenderer { +public class PopomEntityRenderer extends MobEntityRenderer> { private static final Identifier TEXTURE = ParadiseLost.locate("textures/entity/popom/popom.png"); public PopomEntityRenderer(EntityRendererFactory.Context renderManager) { - super(renderManager); + super(renderManager, new PopomEntityModel<>(renderManager.getPart(ParadiseLostModelLayers.POPOM)), 0.7F); } - public Identifier getTexture(PigEntity entity) { + public void render(PopomEntity popomEntity, float f, float g, MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i) { + matrixStack.push(); + this.model.furSize = popomEntity.getFurSize(); + matrixStack.pop(); + super.render(popomEntity, f, g, matrixStack, vertexConsumerProvider, i); + } + + public Identifier getTexture(PopomEntity entity) { return TEXTURE; } } \ No newline at end of file diff --git a/src/main/java/net/id/paradiselost/entities/ParadiseLostEntityTypes.java b/src/main/java/net/id/paradiselost/entities/ParadiseLostEntityTypes.java index 11401d782..48ba7648f 100644 --- a/src/main/java/net/id/paradiselost/entities/ParadiseLostEntityTypes.java +++ b/src/main/java/net/id/paradiselost/entities/ParadiseLostEntityTypes.java @@ -42,7 +42,7 @@ public class ParadiseLostEntityTypes { public static final EntityType MOA = add("moa", of(MoaEntity::new, CREATURE, changing(0.8F, 1.9F), 5), attributes(MoaEntity::createMoaAttributes), spawnRestrictions(ParadiseLostAnimalEntity::isValidNaturalParadiseLostSpawn)); - public static final EntityType POPOM = add("popom", of(PopomEntity::new, CREATURE, changing(0.6F, 1.0F), 5), + public static final EntityType POPOM = add("popom", of(PopomEntity::new, CREATURE, changing(1.1F, 1.0F), 5), attributes(PopomEntity::createPopomAttributes), spawnRestrictions(PopomEntity::canMobSpawn)); // projectile diff --git a/src/main/java/net/id/paradiselost/entities/passive/PopomEntity.java b/src/main/java/net/id/paradiselost/entities/passive/PopomEntity.java index 8dcaed3b4..adb1353e8 100644 --- a/src/main/java/net/id/paradiselost/entities/passive/PopomEntity.java +++ b/src/main/java/net/id/paradiselost/entities/passive/PopomEntity.java @@ -1,20 +1,37 @@ package net.id.paradiselost.entities.passive; +import net.id.paradiselost.entities.hostile.EnvoyEntity; import net.id.paradiselost.util.ParadiseLostSoundEvents; import net.minecraft.entity.EntityType; import net.minecraft.entity.attribute.DefaultAttributeContainer; import net.minecraft.entity.attribute.EntityAttributes; +import net.minecraft.entity.data.DataTracker; +import net.minecraft.entity.data.TrackedData; +import net.minecraft.entity.data.TrackedDataHandlerRegistry; +import net.minecraft.entity.passive.AnimalEntity; +import net.minecraft.entity.passive.PassiveEntity; import net.minecraft.entity.passive.PigEntity; +import net.minecraft.item.ItemStack; import net.minecraft.nbt.NbtCompound; +import net.minecraft.registry.tag.ItemTags; +import net.minecraft.server.world.ServerWorld; import net.minecraft.sound.SoundEvent; import net.minecraft.world.World; +import org.jetbrains.annotations.Nullable; -public class PopomEntity extends PigEntity { +public class PopomEntity extends AnimalEntity { + + private static final TrackedData FUR_SIZE; public PopomEntity(EntityType entityType, World world) { super(entityType, world); } + protected void initDataTracker(DataTracker.Builder builder) { + super.initDataTracker(builder); + builder.add(FUR_SIZE, 0); + } + // Custom sounds for Popom @Override protected SoundEvent getAmbientSound() { @@ -33,19 +50,38 @@ protected SoundEvent getDeathSound() { // Define attributes for Popom public static DefaultAttributeContainer.Builder createPopomAttributes() { return createMobAttributes() - .add(EntityAttributes.GENERIC_MAX_HEALTH, 20.0D) + .add(EntityAttributes.GENERIC_MAX_HEALTH, 10.0D) .add(EntityAttributes.GENERIC_MOVEMENT_SPEED, 0.25D); } + @Nullable + @Override + public PassiveEntity createChild(ServerWorld world, PassiveEntity entity) { + return null; + } + @Override public void writeCustomDataToNbt(NbtCompound compound) { super.writeCustomDataToNbt(compound); - // Any custom data you want to save + compound.putInt("furSize", this.dataTracker.get(FUR_SIZE)); } @Override public void readCustomDataFromNbt(NbtCompound compound) { super.readCustomDataFromNbt(compound); - // Any custom data you want to load + this.dataTracker.set(FUR_SIZE, compound.getInt("furSize")); + } + + @Override + public boolean isBreedingItem(ItemStack stack) { + return stack.isIn(ItemTags.FLOWERS); + } + + public int getFurSize() { + return this.dataTracker.get(FUR_SIZE); + } + + static { + FUR_SIZE = DataTracker.registerData(PopomEntity.class, TrackedDataHandlerRegistry.INTEGER); } } \ No newline at end of file diff --git a/src/main/resources/assets/paradise_lost/textures/entity/popom/popom.png b/src/main/resources/assets/paradise_lost/textures/entity/popom/popom.png index 54322cf94..356d6719c 100644 Binary files a/src/main/resources/assets/paradise_lost/textures/entity/popom/popom.png and b/src/main/resources/assets/paradise_lost/textures/entity/popom/popom.png differ diff --git a/src/main/resources/assets/paradise_lost/textures/entity/popom/popom_clean.png b/src/main/resources/assets/paradise_lost/textures/entity/popom/popom_clean.png new file mode 100644 index 000000000..356d6719c Binary files /dev/null and b/src/main/resources/assets/paradise_lost/textures/entity/popom/popom_clean.png differ diff --git a/src/main/resources/assets/paradise_lost/textures/entity/popom/popom_fur.png b/src/main/resources/assets/paradise_lost/textures/entity/popom/popom_fur.png new file mode 100644 index 000000000..356d6719c Binary files /dev/null and b/src/main/resources/assets/paradise_lost/textures/entity/popom/popom_fur.png differ