Jump to content

Recommended Posts

Posted (edited)

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
Posted
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?

Posted (edited)

Render File:
 

Spoiler

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;

@SideOnly(Side.CLIENT)
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> {

        @Override
        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);
        
    }
    
}

RenderLayerDeathScythe

Spoiler

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;

@SideOnly(Side.CLIENT)
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())
        {
            GlStateManager.pushMatrix();

            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);
            GlStateManager.popMatrix();
        }
    }

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

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

            this.translateToHand(handSide);
            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);
            GlStateManager.rotate(90,0,90,0);
            GlStateManager.scale(2.5f,2.5f,2.5f);
            GlStateManager.translate(-0.7,+0.25,0);
            GlStateManager.rotate(30,1,0,1);
            GlStateManager.rotate(-20,0,1,0);

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

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



    public boolean shouldCombineTextures()
    {
        return false;
    }
}

ModelDeath

Spoiler

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);
        this.Body2.addChild(this.Hips);
        this.CapeMiddle.addChild(this.RightCape);
        this.Body1.addChild(this.Body2);
        this.Head.addChild(this.Hoodie);
        this.LeftLeg.addChild(this.LeftFoot);
        this.RightLeg.addChild(this.RightFoot);
        this.RightArm1.addChild(this.RightArm2);
        this.CapeMiddle.addChild(this.LeftCape);
        this.Body1.addChild(this.Bobs);
        this.LeftArm1.addChild(this.LeftArm2);
        this.Neck.addChild(this.Head);
    }

    @Override
    public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) {
        this.RightLeg.render(f5);
        this.RightArmLayer.render(f5);
        this.RightLegLayer.render(f5);
        this.LeftArmLayer.render(f5);
        this.CapeMiddle.render(f5);
        this.Body1.render(f5);
        this.Neck.render(f5);
        this.RightArm1.render(f5);
        this.LeftArm1.render(f5);
        this.LeftLeg.render(f5);
        this.BodyLayer.render(f5);
        this.LeftLegLayer.render(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
        setRotateAngle(LeftArm1,helper.degToRad(-52.82f),helper.degToRad(-7.39f),helper.degToRad(0f));
        setRotateAngle(RightArm1,helper.degToRad(-23.86f),helper.degToRad(-3.58f),helper.degToRad(0f));
        setRotateAngle(RightArm2,helper.degToRad(3.27f),helper.degToRad(-0.32f),helper.degToRad(0f));
        //a bit of arms movement during holding the scythe
        setRotateAngle(LeftArm1,helper.degToRad(-52.82f)+MathHelper.sin(age*0.05f)*0.04f,helper.degToRad(-7.39f),helper.degToRad(0f));
        LeftArmLayer.rotateAngleX=helper.degToRad(-52.82f)+MathHelper.sin(age*0.05f)*0.04f;
        setRotateAngle(RightArm1,helper.degToRad(-23.86f)+MathHelper.sin(age*0.05f)*0.04f,helper.degToRad(-3.58f),helper.degToRad(0f));
        RightArmLayer.rotateAngleX=helper.degToRad(-23.86f)+MathHelper.sin(age*0.05f)*0.04f;
        //breathing
        Body1.rotateAngleX=MathHelper.sin(age*0.05f)*0.04f;
        Body2.rotateAngleX=-MathHelper.sin(age*0.05f)*0.06f;
        Hips.rotateAngleX=MathHelper.sin(age*0.05f)*0.02f;
    }


    public void postRenderArm(float scale, EnumHandSide side)
    {
        this.getArmForSide(side).postRender(scale);
    }
    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
Posted

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.

  • Like 1
Posted
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!

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.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
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.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Oh I forgot to update the title. I figured out the issue and I'm rather embarrassed to say that it was a file path issue. The game already knew I was accessing the achievements so I wasn't suppose to include advancements in the file path. Minecraft file paths have always confused me a little bit... ResourceLocation advancementId = new ResourceLocation( TheDeadRise.MODID,"adventure/spawntrigger");
    • Can someone help my with this? My forge server won't open and I'm not that good with this stuff. It gave me this error message:   C:\Users\apbeu\Desktop\Forge server>java -Xmx4G -Xms1G -jar server.jar nogui 2024-12-11 18:21:01,054 main WARN Advanced terminal features are not available in this environment [18:21:01] [main/INFO] [cp.mo.mo.Launcher/MODLAUNCHER]: ModLauncher running: args [--gameDir, ., --launchTarget, fmlserver, --fml.forgeVersion, 36.2.34, --fml.mcpVersion, 20210115.111550, --fml.mcVersion, 1.16.5, --fml.forgeGroup, net.minecraftforge, nogui] [18:21:01] [main/INFO] [cp.mo.mo.Launcher/MODLAUNCHER]: ModLauncher 8.1.3+8.1.3+main-8.1.x.c94d18ec starting: java version 21.0.4 by Oracle Corporation Exception in thread "main" java.lang.IllegalAccessError: class cpw.mods.modlauncher.SecureJarHandler (in unnamed module @0x402e37bc) cannot access class sun.security.util.ManifestEntryVerifier (in module java.base) because module java.base does not export sun.security.util to unnamed module @0x402e37bc         at cpw.mods.modlauncher.SecureJarHandler.lambda$static$1(SecureJarHandler.java:45)         at cpw.mods.modlauncher.api.LamdbaExceptionUtils.uncheck(LamdbaExceptionUtils.java:95)         at cpw.mods.modlauncher.SecureJarHandler.<clinit>(SecureJarHandler.java:45)         at cpw.mods.modlauncher.Launcher.lambda$new$6(Launcher.java:55)         at java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1708)         at cpw.mods.modlauncher.api.TypesafeMap.computeIfAbsent(TypesafeMap.java:52)         at cpw.mods.modlauncher.api.TypesafeMap.computeIfAbsent(TypesafeMap.java:47)         at cpw.mods.modlauncher.Environment.computePropertyIfAbsent(Environment.java:62)         at cpw.mods.modlauncher.Launcher.<init>(Launcher.java:55)         at cpw.mods.modlauncher.Launcher.main(Launcher.java:66)         at net.minecraftforge.server.ServerMain$Runner.runLauncher(ServerMain.java:63)         at net.minecraftforge.server.ServerMain$Runner.access$100(ServerMain.java:60)         at net.minecraftforge.server.ServerMain.main(ServerMain.java:57) C:\Users\apbeu\Desktop\Forge server>pause
    • Here is the url for the crash report if anyone can help me, please. https://mclo.gs/KGn5LWy  
    • Every single time I try and open my modpack it crashes before the game fully opens and I don't know what is wrong. I open the crash logs but I don't understand what any of it means. What do I do?
    • Hey, sorry I haven't said anything in a while. I was banned on here for sending you straight up crash logs and they banned me for spam... but I learned that these forums are for forge only and I was working with neoforge... but thank you for all the help.
  • Topics

×
×
  • Create New...

Important Information

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