[add] Duck

This commit is contained in:
2026-10-03 14:33:11 +02:00
parent 6fa0373446
commit e465d94601
15 changed files with 211 additions and 3 deletions
@@ -1,2 +1,2 @@
// 1.21.1 2026-09-29T16:23:56.996726612 Languages: en_us for mod: masterwild
35f1e1ce16f4613ff411eec96f0bcb280108e169 assets/masterwild/lang/en_us.json
// 1.21.1 2026-10-03T14:21:42.612129097 Languages: en_us for mod: masterwild
7994d49f6ed6926077869619b9bc8775e7d4956a assets/masterwild/lang/en_us.json
@@ -1,8 +1,9 @@
// 1.21.1 2026-09-29T16:23:56.997419393 Item Models: masterwild
// 1.21.1 2026-10-03T14:21:42.613329425 Item Models: masterwild
a92e1a88c1d3c3c04b2b001f0bffd19a1f3462f0 assets/masterwild/models/item/banana.json
8cb5b876c97ae89d180a200612d0d14c8456c2f7 assets/masterwild/models/item/banana_peel.json
63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/masterwild/models/item/butterfly_spawn_egg.json
63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/masterwild/models/item/capybara_spawn_egg.json
63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/masterwild/models/item/duck_spawn_egg.json
63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/masterwild/models/item/firefly_spawn_egg.json
63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/masterwild/models/item/hedgehog_spawn_egg.json
63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/masterwild/models/item/monkey_spawn_egg.json
@@ -2,6 +2,7 @@
"creativetab.masterwild.masterwild": "MasterWild",
"entity.masterwild.butterfly": "Butterfly",
"entity.masterwild.capybara": "Capybara",
"entity.masterwild.duck": "Duck",
"entity.masterwild.firefly": "Firefly",
"entity.masterwild.hedgehog": "Hedgehog",
"entity.masterwild.monkey": "Monkey",
@@ -14,6 +15,7 @@
"item.masterwild.banana_peel": "Banana Peel",
"item.masterwild.butterfly_spawn_egg": "Butterfly Spawn Egg",
"item.masterwild.capybara_spawn_egg": "Capybara Spawn Egg",
"item.masterwild.duck_spawn_egg": "Duck Spawn Egg",
"item.masterwild.firefly_spawn_egg": "Firefly Spawn Egg",
"item.masterwild.hedgehog_spawn_egg": "Hedgehog Spawn Egg",
"item.masterwild.monkey_spawn_egg": "Monkey Spawn Egg",
@@ -0,0 +1,3 @@
{
"parent": "minecraft:item/template_spawn_egg"
}
@@ -32,6 +32,7 @@ public class ModCreativeModeTabs {
output.accept(ModItems.RACCOON_SPAWN_EGG);
output.accept(ModItems.MONKEY_SPAWN_EGG);
output.accept(ModItems.CAPYBARA_SPAWN_EGG);
output.accept(ModItems.DUCK_SPAWN_EGG);
}).build());
@@ -55,6 +55,9 @@ public class ModItems {
public static final DeferredItem<Item> CAPYBARA_SPAWN_EGG = ITEMS.register("capybara_spawn_egg",
() -> new DeferredSpawnEggItem(ModEntities.CAPYBARA, 0x372a21, 0x9e9178,
new Item.Properties()));
public static final DeferredItem<Item> DUCK_SPAWN_EGG = ITEMS.register("duck_spawn_egg",
() -> new DeferredSpawnEggItem(ModEntities.DUCK, 0x341b10, 0x516a4c,
new Item.Properties()));
public static void register(IEventBus eventBus) {
ITEMS.register(eventBus);
@@ -26,6 +26,7 @@ import ovh.glitchlabs.masterwild.entity.client.Rooster.RoosterRenderer;
import ovh.glitchlabs.masterwild.entity.client.Shark.SharkRenderer;
import ovh.glitchlabs.masterwild.entity.client.butterfly.ButterflyRenderer;
import ovh.glitchlabs.masterwild.entity.client.capibara.CapybaraRenderer;
import ovh.glitchlabs.masterwild.entity.client.duck.duckRenderer;
import ovh.glitchlabs.masterwild.entity.client.firefly.FireflyRenderer;
import ovh.glitchlabs.masterwild.entity.client.hedgehog.HedgehogRenderer;
import ovh.glitchlabs.masterwild.entity.client.red_panda.Red_PandaRenderer;
@@ -86,6 +87,7 @@ public class Masterwild {
EntityRenderers.register(ModEntities.RACCOON.get(), RaccoonRenderer::new);
EntityRenderers.register(ModEntities.MONKEY.get(), MonkeyRenderer::new);
EntityRenderers.register(ModEntities.CAPYBARA.get(), CapybaraRenderer::new);
EntityRenderers.register(ModEntities.DUCK.get(), duckRenderer::new);
}
}
}
@@ -31,5 +31,6 @@ public class ModItemModelProvider extends ItemModelProvider {
withExistingParent(ModItems.RACCOON_SPAWN_EGG.getId().getPath(), mcLoc("item/template_spawn_egg"));
withExistingParent(ModItems.MONKEY_SPAWN_EGG.getId().getPath(), mcLoc("item/template_spawn_egg"));
withExistingParent(ModItems.CAPYBARA_SPAWN_EGG.getId().getPath(), mcLoc("item/template_spawn_egg"));
withExistingParent(ModItems.DUCK_SPAWN_EGG.getId().getPath(), mcLoc("item/template_spawn_egg"));
}
}
@@ -27,6 +27,7 @@ public class ModLanguageProvider extends LanguageProvider {
add(ModEntities.RACCOON.get(), "Raccoon");
add(ModEntities.MONKEY.get(), "Monkey");
add(ModEntities.CAPYBARA.get(), "Capybara");
add(ModEntities.DUCK.get(), "Duck");
add(ModItems.PINGUIN_SPAWN_EGG.get(), "Pinguin Spawn Egg");
add(ModItems.FIREFLY_SPAWN_EGG.get(), "Firefly Spawn Egg");
@@ -38,6 +39,7 @@ public class ModLanguageProvider extends LanguageProvider {
add(ModItems.RACCOON_SPAWN_EGG.get(), "Raccoon Spawn Egg");
add(ModItems.MONKEY_SPAWN_EGG.get(), "Monkey Spawn Egg");
add(ModItems.CAPYBARA_SPAWN_EGG.get(), "Capybara Spawn Egg");
add(ModItems.DUCK_SPAWN_EGG.get(), "Duck Spawn Egg");
add("creativetab.masterwild.masterwild", "MasterWild");
@@ -54,6 +54,10 @@ public class ModEntities {
ENTITY_TYPES.register("capybara", () -> EntityType.Builder.of(CapybaraEntity::new, MobCategory.CREATURE)
.sized(0.6f, 0.5f).build("capybara"));
public static final Supplier<EntityType<duckEntity>> DUCK =
ENTITY_TYPES.register("duck", () -> EntityType.Builder.of(duckEntity::new, MobCategory.CREATURE)
.sized(0.6f, 0.5f).build("duck"));
public static void register(IEventBus eventBus) {
ENTITY_TYPES.register(eventBus);
@@ -0,0 +1,107 @@
package ovh.glitchlabs.masterwild.entity.client.duck;// Made with Blockbench 5.2.0
// Exported for Minecraft version 1.17 or later with Mojang mappings
// Paste this class into your mod and generate all required imports
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
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.*;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.Mth;
import ovh.glitchlabs.masterwild.Masterwild;
import ovh.glitchlabs.masterwild.entity.custom.duckEntity;
public class duckModel<T extends duckEntity> extends HierarchicalModel<T> {
// This layer location should be baked with EntityRendererProvider.Context in the entity renderer and passed into this model's constructor
public static final ModelLayerLocation LAYER_LOCATION = new ModelLayerLocation(ResourceLocation.fromNamespaceAndPath(Masterwild.MODID, "duckmodel"), "main");
private final ModelPart Duck;
private final ModelPart body;
private final ModelPart flapps;
private final ModelPart R_flapps;
private final ModelPart L_flapps;
private final ModelPart head;
private final ModelPart legs;
private final ModelPart R_leg;
private final ModelPart L_leg;
public duckModel(ModelPart root) {
this.Duck = root.getChild("Duck");
this.body = this.Duck.getChild("body");
this.flapps = this.body.getChild("flapps");
this.R_flapps = this.flapps.getChild("R_flapps");
this.L_flapps = this.flapps.getChild("L_flapps");
this.head = this.body.getChild("head");
this.legs = this.body.getChild("legs");
this.R_leg = this.legs.getChild("R_leg");
this.L_leg = this.legs.getChild("L_leg");
}
public static LayerDefinition createBodyLayer() {
MeshDefinition meshdefinition = new MeshDefinition();
PartDefinition partdefinition = meshdefinition.getRoot();
PartDefinition Duck = partdefinition.addOrReplaceChild("Duck", CubeListBuilder.create(), PartPose.offset(0.0F, 24.0F, 0.0F));
PartDefinition body = Duck.addOrReplaceChild("body", CubeListBuilder.create().texOffs(0, 0).addBox(-4.3214F, -2.7578F, -5.6071F, 7.0F, 7.0F, 9.0F, new CubeDeformation(0.0F))
.texOffs(32, 0).addBox(-2.3214F, -0.7578F, 3.3929F, 3.0F, 0.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offset(0.8214F, -5.2422F, 1.6071F));
PartDefinition cube_r1 = body.addOrReplaceChild("cube_r1", CubeListBuilder.create().texOffs(32, 2).addBox(-2.0F, -2.0F, -1.0F, 3.0F, 0.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-0.3214F, 0.7422F, 5.1429F, 0.3927F, 0.0F, 0.0F));
PartDefinition cube_r2 = body.addOrReplaceChild("cube_r2", CubeListBuilder.create().texOffs(32, 4).addBox(-2.0F, -2.0F, -1.0F, 3.0F, 0.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-0.3214F, 1.4922F, 3.3929F, -0.3927F, 0.0F, 0.0F));
PartDefinition flapps = body.addOrReplaceChild("flapps", CubeListBuilder.create(), PartPose.offset(3.6786F, -0.0078F, -1.6071F));
PartDefinition R_flapps = flapps.addOrReplaceChild("R_flapps", CubeListBuilder.create(), PartPose.offset(-8.5F, -0.4036F, 0.3799F));
PartDefinition cube_r3 = R_flapps.addOrReplaceChild("cube_r3", CubeListBuilder.create().texOffs(20, 28).addBox(0.0F, -2.0F, -3.0F, 1.0F, 5.0F, 7.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-0.5F, 0.4036F, -0.3799F, -0.2182F, 0.0F, 0.0F));
PartDefinition L_flapps = flapps.addOrReplaceChild("L_flapps", CubeListBuilder.create(), PartPose.offset(-0.5F, -0.4036F, 0.3799F));
PartDefinition cube_r4 = L_flapps.addOrReplaceChild("cube_r4", CubeListBuilder.create().texOffs(20, 16).addBox(-1.0F, -2.0F, -3.0F, 1.0F, 5.0F, 7.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.5F, 0.4036F, -0.3799F, -0.2182F, 0.0F, 0.0F));
PartDefinition head = body.addOrReplaceChild("head", CubeListBuilder.create().texOffs(32, 6).addBox(-1.0F, -2.0F, -1.0F, 2.0F, 1.0F, 2.0F, new CubeDeformation(0.0F))
.texOffs(0, 16).addBox(-2.5F, -4.0F, 1.0F, 5.0F, 9.0F, 5.0F, new CubeDeformation(0.0F)), PartPose.offset(-0.8214F, -3.7578F, -8.6071F));
PartDefinition legs = body.addOrReplaceChild("legs", CubeListBuilder.create(), PartPose.offset(0.4286F, 5.2422F, -1.6071F));
PartDefinition R_leg = legs.addOrReplaceChild("R_leg", CubeListBuilder.create().texOffs(0, 30).addBox(-4.5F, -1.0F, -1.0F, 3.0F, 1.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 0.0F, 0.0F));
PartDefinition L_leg = legs.addOrReplaceChild("L_leg", CubeListBuilder.create().texOffs(10, 30).addBox(1.5F, -1.0F, -1.0F, 3.0F, 1.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offset(-2.5F, 0.0F, 0.0F));
return LayerDefinition.create(meshdefinition, 64, 64);
}
@Override
public void setupAnim(duckEntity entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) {
this.root().getAllParts().forEach(ModelPart::resetPose);
this.applyHeadRotation(netHeadYaw, headPitch);
this.walk(limbSwing, limbSwingAmount);
}
private void applyHeadRotation(float headYaw, float headPitch) {
headYaw = Mth.clamp(headYaw, -30f, 30f);
headPitch = Mth.clamp(headPitch, -25f, 45f);
this.head.yRot = headYaw * ((float) Math.PI / 180f);
this.head.xRot = headPitch * ((float) Math.PI / 180f);
}
private void walk(float limbSwing, float limbSwingAmount) {
float amount = 1.0F * limbSwingAmount;
this.R_leg.xRot = Mth.cos(limbSwing * 0.6662F) * amount;
this.L_leg.xRot = Mth.cos(limbSwing * 0.6662F) * amount;
}
@Override
public void renderToBuffer(PoseStack poseStack, VertexConsumer vertexConsumer, int packedLight, int packedOverlay, int color) {
Duck.render(poseStack, vertexConsumer, packedLight, packedOverlay, color);
}
@Override
public ModelPart root() {
return Duck;
}
}
@@ -0,0 +1,21 @@
package ovh.glitchlabs.masterwild.entity.client.duck;
import net.minecraft.client.renderer.entity.EntityRendererProvider;
import net.minecraft.client.renderer.entity.MobRenderer;
import net.minecraft.resources.ResourceLocation;
import ovh.glitchlabs.masterwild.Masterwild;
import ovh.glitchlabs.masterwild.entity.custom.duckEntity;
public class duckRenderer extends MobRenderer<duckEntity, duckModel<duckEntity>> {
private static final ResourceLocation TEXTURE =
ResourceLocation.fromNamespaceAndPath(Masterwild.MODID, "textures/entity/duck.png");
public duckRenderer(EntityRendererProvider.Context context) {
super(context, new duckModel<>(context.bakeLayer(duckModel.LAYER_LOCATION)), 0.45f);
}
@Override
public ResourceLocation getTextureLocation(duckEntity duckEntity) {
return TEXTURE;
}
}
@@ -0,0 +1,58 @@
package ovh.glitchlabs.masterwild.entity.custom;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.entity.AgeableMob;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.Mob;
import net.minecraft.world.entity.ai.attributes.AttributeSupplier;
import net.minecraft.world.entity.ai.attributes.Attributes;
import net.minecraft.world.entity.ai.goal.*;
import net.minecraft.world.entity.animal.Animal;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.crafting.Ingredient;
import net.minecraft.world.level.Level;
import org.jetbrains.annotations.Nullable;
import ovh.glitchlabs.masterwild.entity.ModEntities;
public class duckEntity extends Animal {
private static final Ingredient FOOD = Ingredient.of(Items.BREAD);
public duckEntity(EntityType<? extends Animal> entityType, Level level) {
super(entityType, level);
}
public static AttributeSupplier.Builder createAttributes() {
return Mob.createMobAttributes()
.add(Attributes.MOVEMENT_SPEED, 0.3)
.add(Attributes.MAX_HEALTH, 5)
.add(Attributes.ARMOR, 0)
.add(Attributes.ATTACK_DAMAGE, 0)
.add(Attributes.FOLLOW_RANGE, 16)
.add(Attributes.STEP_HEIGHT, 0.6);
}
@Override
public boolean isFood(ItemStack itemStack) {
return FOOD.test(itemStack);
}
@Override
protected void registerGoals() {
this.goalSelector.addGoal(0, new FloatGoal(this));
this.goalSelector.addGoal(1, new PanicGoal(this, 1.5));
this.goalSelector.addGoal(2, new BreedGoal(this, 1.0));
this.goalSelector.addGoal(3, new TemptGoal(this, 1.1, FOOD, false));
this.goalSelector.addGoal(4, new FollowParentGoal(this, 1.1));
this.goalSelector.addGoal(5, new WaterAvoidingRandomStrollGoal(this, 0.8));
this.goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 6.0F));
this.goalSelector.addGoal(7, new RandomLookAroundGoal(this));
}
@Nullable
@Override
public AgeableMob getBreedOffspring(ServerLevel serverLevel, AgeableMob ageableMob) {
return ModEntities.DUCK.get().create(serverLevel);
}
}
@@ -13,6 +13,7 @@ import ovh.glitchlabs.masterwild.entity.client.Rooster.RoosterModel;
import ovh.glitchlabs.masterwild.entity.client.Shark.SharkModel;
import ovh.glitchlabs.masterwild.entity.client.butterfly.ButterflyModel;
import ovh.glitchlabs.masterwild.entity.client.capibara.CapybaraModel;
import ovh.glitchlabs.masterwild.entity.client.duck.duckModel;
import ovh.glitchlabs.masterwild.entity.client.firefly.FireflyModel;
import ovh.glitchlabs.masterwild.entity.client.hedgehog.HedgehogModel;
import ovh.glitchlabs.masterwild.entity.client.red_panda.Red_PandaModel;
@@ -32,6 +33,7 @@ public class ModEventBusEvents {
event.registerLayerDefinition(RaccoonModel.LAYER_LOCATION, RaccoonModel::createBodyLayer);
event.registerLayerDefinition(MonkeyModel.LAYER_LOCATION, MonkeyModel::createBodyLayer);
event.registerLayerDefinition(CapybaraModel.LAYER_LOCATION, CapybaraModel::createBodyLayer);
event.registerLayerDefinition(duckModel.LAYER_LOCATION, duckModel::createBodyLayer);
}
@SubscribeEvent
@@ -45,5 +47,6 @@ public class ModEventBusEvents {
event.put(ModEntities.RACCOON.get(), RaccoonEntity.createAttributes().build());
event.put(ModEntities.MONKEY.get(), MonkeyEntity.createAttributes().build());
event.put(ModEntities.CAPYBARA.get(), CapybaraEntity.createAttributes().build());
event.put(ModEntities.DUCK.get(), duckEntity.createAttributes().build());
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB