Jump to content

[SOLVED]Held Item positioning


Recommended Posts

Hello! I need help - I've got an living entity with a held item. The item is rendered using layer in render class. The problem is the item is not connected with hand - it stays in place all the time, even if the hand is moving. How can I implement feature of connecting held item with hand?

Edited by Krevik
Link to comment
Share on other sites

6 hours ago, Krevik said:

The item is rendered using layer in render class.

Are you using a custom layer for that or a vanilla one? If it's a custom layer you need to show it's implementation to us.

If you are using a vanilla one is the model of your entity an instance of BodelBiped? And if it is are you overriding ModelBiped#postRenderArm?

Link to comment
Share on other sites

Render File:


import com.Krevik.Entities.EntityDeath;
import com.Krevik.Main.EntityAndRenderRegistry;
import com.Krevik.Models.ModelDeath;

import com.Krevik.Renderers.Layer.RenderLayerDeathScythe;
import com.Krevik.Renderers.Layer.RenderLayerHeldItem;
import net.minecraft.client.renderer.entity.Render;
import net.minecraft.client.renderer.entity.RenderLiving;
import net.minecraft.client.renderer.entity.RenderManager;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fml.client.registry.IRenderFactory;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

public class RenderDeath extends RenderLiving<EntityDeath>
    public static final Factory FACTORY = new Factory();

    public RenderDeath(RenderManager renderManagerIn)
        super(renderManagerIn, new ModelDeath(), 0.8F);
        this.addLayer(new RenderLayerDeathScythe(this));


     * Returns the location of an entity's texture. Doesn't seem to be called unless you call Render.bindEntityTexture.
    protected ResourceLocation getEntityTexture(EntityDeath entity)
        return EntityAndRenderRegistry.DeathLoc;
    public static class Factory implements IRenderFactory<EntityDeath> {

        public Render<? super EntityDeath> createRenderFor(RenderManager manager) {
            return new RenderDeath(manager);

    protected void applyRotations(EntityDeath entityLiving, float p_77043_2_, float rotationYaw, float partialTicks)
        super.applyRotations(entityLiving, p_77043_2_, rotationYaw, partialTicks);



import com.Krevik.Models.ModelDeath;
import com.Krevik.Models.ModelGaznowel;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.block.model.ItemCameraTransforms;
import net.minecraft.client.renderer.entity.RenderLivingBase;
import net.minecraft.client.renderer.entity.RenderPlayer;
import net.minecraft.client.renderer.entity.layers.LayerRenderer;
import net.minecraft.entity.EntityLiving;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumHandSide;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

public class RenderLayerDeathScythe implements LayerRenderer<EntityLivingBase>

    protected final RenderLivingBase<?> livingEntityRenderer;

    public RenderLayerDeathScythe(RenderLivingBase<?> livingEntityRendererIn)
        this.livingEntityRenderer = livingEntityRendererIn;

    public void doRenderLayer(EntityLivingBase entitylivingbaseIn, float limbSwing, float limbSwingAmount, float partialTicks, float ageInTicks, float netHeadYaw, float headPitch, float scale)
        boolean flag = entitylivingbaseIn.getPrimaryHand() == EnumHandSide.RIGHT;
        ItemStack itemstack = flag ? entitylivingbaseIn.getHeldItemOffhand() : entitylivingbaseIn.getHeldItemMainhand();
        ItemStack itemstack1 = flag ? entitylivingbaseIn.getHeldItemMainhand() : entitylivingbaseIn.getHeldItemOffhand();

        if (!itemstack.isEmpty() || !itemstack1.isEmpty())

            if (this.livingEntityRenderer.getMainModel().isChild)
                float f = 0.5F;
                GlStateManager.translate(0.0F, 0.75F, 0.0F);
                GlStateManager.scale(0.5F, 0.5F, 0.5F);

            this.renderHeldItem(entitylivingbaseIn, itemstack1, ItemCameraTransforms.TransformType.THIRD_PERSON_RIGHT_HAND, EnumHandSide.RIGHT);
            this.renderHeldItem(entitylivingbaseIn, itemstack, ItemCameraTransforms.TransformType.THIRD_PERSON_LEFT_HAND, EnumHandSide.LEFT);

    private void renderHeldItem(EntityLivingBase p_188358_1_, ItemStack p_188358_2_, ItemCameraTransforms.TransformType p_188358_3_, EnumHandSide handSide)
        if (!p_188358_2_.isEmpty())

            if (p_188358_1_.isSneaking())
                GlStateManager.translate(0.0F, 0.2F, 0.0F);

            GlStateManager.rotate(-90.0F, 1.0F, 0.0F, 0.0F);
            GlStateManager.rotate(180.0F, 0.0F, 1.0F, 0.0F);
            boolean flag=false;
            GlStateManager.translate((float)(flag ? -1 : 1) / 16.0F, 0.125F, -0.625F);

            Minecraft.getMinecraft().getItemRenderer().renderItemSide(p_188358_1_, p_188358_2_, p_188358_3_, flag);

    protected void translateToHand(EnumHandSide p_191361_1_)
        ((ModelDeath)this.livingEntityRenderer.getMainModel()).postRenderArm(0.0625F, p_191361_1_);

    public boolean shouldCombineTextures()
        return false;



import com.Krevik.Main.FunctionHelper;
import com.Krevik.Main.KCore;
import net.minecraft.client.model.ModelBase;
import net.minecraft.client.model.ModelBiped;
import net.minecraft.client.model.ModelPlayer;
import net.minecraft.client.model.ModelRenderer;
import net.minecraft.client.renderer.entity.RenderPlayer;
import net.minecraft.entity.Entity;
import net.minecraft.util.EnumHandSide;
import net.minecraft.util.math.MathHelper;

 * ModelDeath - Undefined
 * Created using Tabula 7.0.0
public class ModelDeath extends ModelBase {
    public ModelRenderer RightLeg;
    public ModelRenderer LeftLeg;
    public ModelRenderer Body1;
    public ModelRenderer RightArm1;
    public ModelRenderer LeftArm1;
    public ModelRenderer Neck;
    public ModelRenderer RightLegLayer;
    public ModelRenderer LeftLegLayer;
    public ModelRenderer RightArmLayer;
    public ModelRenderer LeftArmLayer;
    public ModelRenderer BodyLayer;
    public ModelRenderer CapeMiddle;
    public ModelRenderer RightFoot;
    public ModelRenderer LeftFoot;
    public ModelRenderer Bobs;
    public ModelRenderer Body2;
    public ModelRenderer Hips;
    public ModelRenderer RightArm2;
    public ModelRenderer LeftArm2;
    public ModelRenderer Head;
    public ModelRenderer Hoodie;
    public ModelRenderer RightCape;
    public ModelRenderer LeftCape;

    public ModelDeath() {
        this.textureWidth = 128;
        this.textureHeight = 128;
        this.Hips = new ModelRenderer(this, 60, 31);
        this.Hips.setRotationPoint(0.0F, 7.0F, 0.0F);
        this.Hips.addBox(-6.5F, 0.0F, -3.0F, 13, 3, 6, 0.0F);
        this.setRotateAngle(Hips, -0.03490658503988659F, 0.0F, 0.0F);
        this.RightCape = new ModelRenderer(this, 30, 44);
        this.RightCape.setRotationPoint(-7.0F, 0.0F, 1.0F);
        this.RightCape.addBox(-6.0F, 0.0F, -1.0F, 6, 34, 1, 0.0F);
        this.setRotateAngle(RightCape, 0.0F, -0.4363323129985824F, 0.0F);
        this.Body2 = new ModelRenderer(this, 62, 18);
        this.Body2.setRotationPoint(0.0F, 12.0F, 0.0F);
        this.Body2.addBox(-4.5F, 0.0F, -3.0F, 9, 7, 6, 0.0F);
        this.setRotateAngle(Body2, 0.03490658503988659F, 0.0F, 0.0F);
        this.Hoodie = new ModelRenderer(this, 46, 100);
        this.Hoodie.setRotationPoint(0.0F, 0.0F, 0.0F);
        this.Hoodie.addBox(-7.0F, -13.0F, -6.2F, 14, 14, 14, 0.0F);
        this.RightLeg = new ModelRenderer(this, 110, 0);
        this.RightLeg.setRotationPoint(-3.4F, 7.0F, 0.0F);
        this.RightLeg.addBox(-2.0F, 0.0F, -2.5F, 4, 15, 5, 0.0F);
        this.setRotateAngle(RightLeg, 0.0F, 0.17453292519943295F, 0.0F);
        this.LeftFoot = new ModelRenderer(this, 96, 21);
        this.LeftFoot.mirror = true;
        this.LeftFoot.setRotationPoint(0.0F, 14.0F, 0.0F);
        this.LeftFoot.addBox(-3.5F, 0.0F, -5.5F, 7, 3, 9, 0.0F);
        this.RightFoot = new ModelRenderer(this, 96, 21);
        this.RightFoot.setRotationPoint(0.0F, 14.0F, 0.0F);
        this.RightFoot.addBox(-3.5F, 0.0F, -5.5F, 7, 3, 9, 0.0F);
        this.RightArm2 = new ModelRenderer(this, 102, 50);
        this.RightArm2.setRotationPoint(0.0F, 8.0F, 0.0F);
        this.RightArm2.addBox(-1.5F, -2.0F, -12.0F, 3, 4, 10, 0.0F);
        this.setRotateAngle(RightArm2, 1.5707963267948966F, 0.0F, 0.0F);
        this.RightArmLayer = new ModelRenderer(this, 0, 6);
        this.RightArmLayer.setRotationPoint(-8.5F, -12.5F, 0.0F);
        this.RightArmLayer.addBox(-3.0F, -2.0F, -2.5F, 5, 12, 5, 0.25F);
        this.RightLegLayer = new ModelRenderer(this, 0, 23);
        this.RightLegLayer.setRotationPoint(-3.4F, 7.0F, 0.0F);
        this.RightLegLayer.addBox(-3.0F, 0.0F, -3.0F, 6, 15, 6, 0.25F);
        this.setRotateAngle(RightLegLayer, 0.0F, 0.17453292519943295F, 0.0F);
        this.LeftArmLayer = new ModelRenderer(this, 0, 6);
        this.LeftArmLayer.mirror = true;
        this.LeftArmLayer.setRotationPoint(8.5F, -12.5F, 0.0F);
        this.LeftArmLayer.addBox(-2.0F, -2.0F, -2.5F, 5, 12, 5, 0.25F);
        this.CapeMiddle = new ModelRenderer(this, 0, 44);
        this.CapeMiddle.setRotationPoint(0.0F, -15.0F, 4.0F);
        this.CapeMiddle.addBox(-7.0F, 0.0F, 0.0F, 14, 34, 1, 0.0F);
        this.Body1 = new ModelRenderer(this, 66, 0);
        this.Body1.setRotationPoint(0.0F, -15.0F, 0.0F);
        this.Body1.addBox(-6.5F, 0.0F, -3.0F, 13, 12, 6, 0.0F);
        this.setRotateAngle(Body1, -0.017453292519943295F, 0.0F, 0.0F);
        this.Neck = new ModelRenderer(this, 102, 120);
        this.Neck.setRotationPoint(0.0F, -15.0F, 0.0F);
        this.Neck.addBox(-3.5F, -3.0F, -2.0F, 7, 4, 4, 0.0F);
        this.LeftCape = new ModelRenderer(this, 30, 44);
        this.LeftCape.mirror = true;
        this.LeftCape.setRotationPoint(7.0F, 0.0F, 1.0F);
        this.LeftCape.addBox(0.0F, 0.0F, -1.0F, 6, 34, 1, 0.0F);
        this.setRotateAngle(LeftCape, 0.0F, 0.4363323129985824F, 0.0F);
        this.RightArm1 = new ModelRenderer(this, 114, 33);
        this.RightArm1.setRotationPoint(-8.5F, -12.5F, 0.0F);
        this.RightArm1.addBox(-1.5F, -2.0F, -2.0F, 3, 12, 4, 0.0F);
        this.Bobs = new ModelRenderer(this, 44, 0);
        this.Bobs.setRotationPoint(0.0F, 0.0F, 0.0F);
        this.Bobs.addBox(-6.5F, 3.0F, -4.0F, 13, 5, 1, 0.0F);
        this.LeftArm1 = new ModelRenderer(this, 114, 33);
        this.LeftArm1.mirror = true;
        this.LeftArm1.setRotationPoint(8.5F, -12.5F, 0.0F);
        this.LeftArm1.addBox(-1.5F, -2.0F, -2.0F, 3, 12, 4, 0.0F);
        this.LeftLeg = new ModelRenderer(this, 110, 0);
        this.LeftLeg.mirror = true;
        this.LeftLeg.setRotationPoint(3.4F, 7.0F, 0.0F);
        this.LeftLeg.addBox(-2.0F, 0.0F, -2.5F, 4, 15, 5, 0.0F);
        this.setRotateAngle(LeftLeg, 0.0F, -0.17453292519943295F, 0.0F);
        this.BodyLayer = new ModelRenderer(this, 68, 40);
        this.BodyLayer.setRotationPoint(0.0F, -15.0F, 0.0F);
        this.BodyLayer.addBox(-6.5F, 0.0F, -3.5F, 13, 12, 7, 0.25F);
        this.setRotateAngle(BodyLayer, -0.017453292519943295F, 0.0F, 0.0F);
        this.LeftLegLayer = new ModelRenderer(this, 0, 23);
        this.LeftLegLayer.mirror = true;
        this.LeftLegLayer.setRotationPoint(3.4F, 7.0F, 0.0F);
        this.LeftLegLayer.addBox(-3.0F, 0.0F, -3.0F, 6, 15, 6, 0.25F);
        this.setRotateAngle(LeftLegLayer, 0.0F, -0.17453292519943295F, 0.0F);
        this.LeftArm2 = new ModelRenderer(this, 102, 50);
        this.LeftArm2.mirror = true;
        this.LeftArm2.setRotationPoint(0.0F, 8.0F, 0.0F);
        this.LeftArm2.addBox(-1.5F, -2.0F, -12.0F, 3, 4, 10, 0.0F);
        this.setRotateAngle(LeftArm2, 1.5707963267948966F, 0.0F, 0.0F);
        this.Head = new ModelRenderer(this, 0, 106);
        this.Head.setRotationPoint(0.0F, -1.0F, 0.0F);
        this.Head.addBox(-6.0F, -11.0F, -5.5F, 12, 11, 11, 0.0F);

    public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) {

     * This is a helper function from Tabula to set the rotation of model parts
    public void setRotateAngle(ModelRenderer modelRenderer, float x, float y, float z) {
        modelRenderer.rotateAngleX = x;
        modelRenderer.rotateAngleY = y;
        modelRenderer.rotateAngleZ = z;

    FunctionHelper helper = KCore.instance.functionHelper;
    public void setRotationAngles(float limbSwing, float limbSwingAmount, float age, float f3, float f4, float f5, Entity entity) {
        super.setRotationAngles(limbSwing, limbSwingAmount, age, f3, f4, f5, entity);
        this.RightLeg.rotateAngleX = MathHelper.cos(limbSwing * 0.6662F) * 1.4F * limbSwingAmount / limbSwing;
        this.RightLegLayer.rotateAngleX = MathHelper.cos(limbSwing * 0.6662F) * 1.4F * limbSwingAmount / limbSwing;

        this.LeftLeg.rotateAngleX = MathHelper.cos(limbSwing * 0.6662F + (float)Math.PI) * 1.4F * limbSwingAmount / limbSwing;
        this.LeftLegLayer.rotateAngleX = MathHelper.cos(limbSwing * 0.6662F + (float)Math.PI) * 1.4F * limbSwingAmount / limbSwing;

        //just holding the scythe
        //a bit of arms movement during holding the scythe

    public void postRenderArm(float scale, EnumHandSide side)
    protected ModelRenderer getArmForSide(EnumHandSide side)
        return side == EnumHandSide.LEFT ? this.LeftArm2 : this.RightArm2;


also github with the code: Link

6 hours ago, V0idWa1k3r said:

Are you using a custom layer for that or a vanilla one? If it's a custom layer you need to show it's implementation to us.

If you are using a vanilla one is the model of your entity an instance of BodelBiped? And if it is are you overriding ModelBiped#postRenderArm?

Layer is copied from vanilla, just changed scaling and added some translation

Edited by Krevik
Link to comment
Share on other sites

42 minutes ago, V0idWa1k3r said:

You are returning the wrong arms in ModelDeath#getArmForSide. You return either LeftArm2 or RightArm2 and those are never rotated. Their parents may be, but they aren't. ModelRenderer#postRender changes the matrix according to it's rotation, not the rotation of it's parents.

YEAH You're right, Thanks!

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Create New...

Important Information

By using this site, you agree to our Terms of Use.