feat: flower crown
Some checks failed
Build / build (push) Has been cancelled

This commit is contained in:
SushiCannibale 2025-07-31 14:24:11 +02:00
parent 9e15e2347c
commit 1a3d94f94e
8 changed files with 189 additions and 18 deletions

View file

@ -0,0 +1,12 @@
package fr.sushi.charmsnfabrics.client;
import fr.sushi.charmsnfabrics.CharmsAndFabrics;
import net.minecraft.client.model.geom.ModelLayerLocation;
import net.minecraft.resources.ResourceLocation;
public class CharmsAndFabricsLayers
{
public static final ModelLayerLocation CROWN_LAYER = new ModelLayerLocation(
ResourceLocation.fromNamespaceAndPath(CharmsAndFabrics.MODID,
"flower_crown_model"), "crown");
}

View file

@ -1,15 +1,16 @@
package fr.sushi.charmsnfabrics.client;
import fr.sushi.charmsnfabrics.CharmsAndFabrics;
import fr.sushi.charmsnfabrics.client.model.FlowerCrownModel;
import fr.sushi.charmsnfabrics.client.renderer.FlowerCrownRenderer;
import fr.sushi.charmsnfabrics.common.CharmsAndFabricRegistries;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.ModContainer;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.fml.common.Mod;
import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent;
import net.neoforged.neoforge.client.event.EntityRenderersEvent;
import net.neoforged.neoforge.client.gui.ConfigurationScreen;
import net.neoforged.neoforge.client.gui.IConfigScreenFactory;
import top.theillusivec4.curios.api.client.ICurioRenderer;
@ -31,4 +32,12 @@ public class CharmsFabricsClient
CharmsAndFabricRegistries.Items.FLOWER_CROWN.get(),
FlowerCrownRenderer::new);
}
@SubscribeEvent
private static void onRegisterLayerDefinitions(
final EntityRenderersEvent.RegisterLayerDefinitions event)
{
event.registerLayerDefinition(CharmsAndFabricsLayers.CROWN_LAYER,
FlowerCrownModel::createLayer);
}
}

View file

@ -1,6 +1,111 @@
package fr.sushi.charmsnfabrics.client.model;
public class FlowerCrownModel
{
import net.minecraft.client.model.HumanoidModel;
import net.minecraft.client.model.geom.ModelPart;
import net.minecraft.client.model.geom.PartPose;
import net.minecraft.client.model.geom.builders.*;
import net.minecraft.client.renderer.entity.state.HumanoidRenderState;
}
public class FlowerCrownModel extends HumanoidModel<HumanoidRenderState>
{
private final ModelPart crown;
private final ModelPart flowers;
public FlowerCrownModel(ModelPart root)
{
super(root);
this.crown = this.getHead().getChild("crown");
this.flowers = this.getHead().getChild("flowers");
}
public static LayerDefinition createLayer()
{
MeshDefinition meshdefinition =
HumanoidModel.createMesh(CubeDeformation.NONE, 0.0f);
PartDefinition partdefinition = meshdefinition.getRoot();
PartDefinition partDefinition1 = partdefinition.clearChild("head");
partDefinition1.clearChild("hat");
partdefinition.clearChild("body");
partdefinition.clearChild("left_arm");
partdefinition.clearChild("right_arm");
partdefinition.clearChild("left_leg");
partdefinition.clearChild("right_leg");
PartDefinition crown = partDefinition1.addOrReplaceChild("crown",
CubeListBuilder.create().texOffs(0, 0)
.addBox(-4.0F, -2.0F, -4.0F, 8.0F, 2.0F, 8.0F),
PartPose.offset(0.0F, -6.0F, 0.0F));
PartDefinition cube_r1 = crown.addOrReplaceChild("cube_r1",
CubeListBuilder.create().texOffs(0, 7)
.addBox(0.0F, -2.0F, -5.0F, 0.0F, 3.0F, 10.0F),
PartPose.offsetAndRotation(4.0F, -1.5F, 0.0F, -3.1416F, 0.0F,
-2.7489F));
PartDefinition cube_r2 = crown.addOrReplaceChild("cube_r2",
CubeListBuilder.create().texOffs(0, 7)
.addBox(0.0F, -2.0F, -5.0F, 0.0F, 3.0F, 10.0F),
PartPose.offsetAndRotation(4.0F, -0.5F, 0.0F, 0.0F, 0.0F,
2.7489F));
PartDefinition cube_r3 = crown.addOrReplaceChild("cube_r3",
CubeListBuilder.create().texOffs(0, 1)
.addBox(0.0F, -2.0F, -5.0F, 0.0F, 3.0F, 10.0F),
PartPose.offsetAndRotation(-4.0F, -1.5F, 0.0F, -3.1416F, 0.0F,
2.7489F));
PartDefinition cube_r4 = crown.addOrReplaceChild("cube_r4",
CubeListBuilder.create().texOffs(0, 1)
.addBox(0.0F, -2.0F, -5.0F, 0.0F, 3.0F, 10.0F),
PartPose.offsetAndRotation(-4.0F, -0.5F, 0.0F, 0.0F, 0.0F,
-2.7489F));
PartDefinition cube_r5 = crown.addOrReplaceChild("cube_r5",
CubeListBuilder.create().texOffs(0, 20)
.addBox(-5.0F, -2.0F, 0.0F, 10.0F, 3.0F, 0.0F),
PartPose.offsetAndRotation(0.0F, -1.5F, 4.0F, -0.3927F, 0.0F,
0.0F));
PartDefinition cube_r6 = crown.addOrReplaceChild("cube_r6",
CubeListBuilder.create().texOffs(0, 20)
.addBox(-5.0F, -2.0F, 0.0F, 10.0F, 3.0F, 0.0F),
PartPose.offsetAndRotation(0.0F, -0.5F, 4.0F, -0.3927F, 0.0F,
-3.1416F));
PartDefinition cube_r7 = crown.addOrReplaceChild("cube_r7",
CubeListBuilder.create().texOffs(0, 14)
.addBox(-5.0F, -2.0F, 0.0F, 10.0F, 3.0F, 0.0F),
PartPose.offsetAndRotation(0.0F, -1.5F, -4.0F, 2.7489F, 0.0F,
3.1416F));
PartDefinition cube_r8 = crown.addOrReplaceChild("cube_r8",
CubeListBuilder.create().texOffs(0, 14)
.addBox(-5.0F, -2.0F, 0.0F, 10.0F, 3.0F, 0.0F),
PartPose.offsetAndRotation(0.0F, -0.5F, -4.0F, 2.7489F, 0.0F,
0.0F));
PartDefinition flowers = partDefinition1.addOrReplaceChild("flowers",
CubeListBuilder.create().texOffs(0, 23)
.addBox(0.0F, -4.0F, -5.0F, 4.0F, 4.0F, 0.0F)
.texOffs(8, 23)
.addBox(5.0F, -2.0F, -4.0F, 0.0F, 3.0F, 3.0F)
.texOffs(0, 19)
.addBox(5.0F, -3.0F, 0.0F, 0.0F, 4.0F, 4.0F)
.texOffs(0, 27)
.addBox(-5.0F, -3.0F, -5.0F, 4.0F, 4.0F, 0.0F)
.texOffs(8, 26)
.addBox(2.0F, -4.0F, 4.5F, 3.0F, 3.0F, 0.0F)
.texOffs(8, 23)
.addBox(-1.0F, -2.0F, 4.5F, 3.0F, 3.0F, 0.0F)
.texOffs(0, 27)
.addBox(-5.0F, -4.0F, 4.5F, 4.0F, 4.0F, 0.0F)
.texOffs(8, 20)
.addBox(-4.5F, -2.0F, 1.25F, 0.0F, 3.0F, 3.0F)
.texOffs(0, 19)
.addBox(-5.0F, -4.0F, -3.75F, 0.0F, 4.0F, 4.0F),
PartPose.offset(0.0F, -6.0F, 0.0F));
return LayerDefinition.create(meshdefinition, 32, 32);
}
@Override
public void setupAnim(HumanoidRenderState renderState)
{
super.setupAnim(renderState);
this.flowers.xScale = 1.2f;
this.flowers.yScale = 1.2f;
this.flowers.zScale = 1.2f;
this.crown.xScale = 1.2f;
this.crown.yScale = 1.2f;
this.crown.zScale = 1.2f;
}
}

View file

@ -1,11 +1,20 @@
package fr.sushi.charmsnfabrics.client.renderer;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
import fr.sushi.charmsnfabrics.client.CharmsAndFabricsLayers;
import fr.sushi.charmsnfabrics.client.model.FlowerCrownModel;
import fr.sushi.charmsnfabrics.common.item.FlowerCrown;
import net.minecraft.client.Minecraft;
import net.minecraft.client.model.EntityModel;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.entity.EntityRendererProvider;
import net.minecraft.client.renderer.entity.ItemRenderer;
import net.minecraft.client.renderer.entity.RenderLayerParent;
import net.minecraft.client.renderer.entity.state.LivingEntityRenderState;
import net.minecraft.client.renderer.texture.OverlayTexture;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.ItemStack;
import org.jetbrains.annotations.NotNull;
import top.theillusivec4.curios.api.SlotContext;
@ -13,9 +22,32 @@ import top.theillusivec4.curios.api.client.ICurioRenderer;
public class FlowerCrownRenderer implements ICurioRenderer
{
@Override
public <S extends LivingEntityRenderState, M extends EntityModel<? super S>> void render(ItemStack stack, SlotContext slotContext, PoseStack poseStack, @NotNull MultiBufferSource renderTypeBuffer, int packedLight, S renderState, RenderLayerParent<S, M> renderLayerParent, EntityRendererProvider.Context context, float yRotation, float xRotation)
private final FlowerCrownModel model;
public FlowerCrownRenderer()
{
System.out.println("UwU");
this.model = new FlowerCrownModel(
Minecraft.getInstance().getEntityModels()
.bakeLayer(CharmsAndFabricsLayers.CROWN_LAYER));
}
@Override
public <S extends LivingEntityRenderState, M extends EntityModel<? super S>> void render(
ItemStack stack, SlotContext slotContext, PoseStack poseStack,
@NotNull MultiBufferSource renderTypeBuffer, int packedLight,
S renderState, RenderLayerParent<S, M> renderLayerParent,
EntityRendererProvider.Context context, float yRotation,
float xRotation)
{
FlowerCrown item = (FlowerCrown) stack.getItem();
ResourceLocation texture = item.getModelTexture();
VertexConsumer vertexconsumer =
ItemRenderer.getArmorFoilBuffer(renderTypeBuffer,
RenderType.entityCutout(
texture),
stack.hasFoil());
ICurioRenderer.setupHumanoidAnimations(this.model, renderState);
this.model.renderToBuffer(poseStack, vertexconsumer, packedLight,
OverlayTexture.NO_OVERLAY);
}
}

View file

@ -1,5 +1,9 @@
package fr.sushi.charmsnfabrics.common.item;
import fr.sushi.charmsnfabrics.CharmsAndFabrics;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import top.theillusivec4.curios.api.SlotContext;
@ -17,4 +21,16 @@ public class FlowerCrown extends Item implements ICurioItem
{
return slotContext.identifier().contains("head");
}
@Override
public boolean canEquip(SlotContext slotContext, ItemStack stack)
{
return slotContext.identifier().contains("head");
}
public ResourceLocation getModelTexture()
{
return ResourceLocation.fromNamespaceAndPath(CharmsAndFabrics.MODID,
"textures/models/accessory/flower_crown.png");
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 552 B

View file

@ -3,16 +3,6 @@
"minecraft:player", "minecraft:armor_stand"
],
"slots": [
"back",
"body",
"belt",
"bracelet",
"charm",
"curio",
"example",
"hands",
"head",
"necklace",
"ring"
"head"
]
}

View file

@ -86,6 +86,13 @@ description='''${mod_description}'''
ordering="NONE"
side="BOTH"
[[dependencies.${mod_id}]]
modId="curios"
type="required"
versionRange="[11.0.1,)"
ordering="BEFORE"
side="BOTH"
# Features are specific properties of the game environment, that you may want to declare you require. This example declares
# that your mod requires GL version 3.2 or higher. Other features will be added. They are side aware so declaring this won't
# stop your mod loading on the server for example.