Jump to content
View in the app

A better way to browse. Learn more.

Forge Forums

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Featured Replies

Posted

Hi, so I have a ranged mob that is meant to hold a bow, but I can't see the bow.

 

I'm not sure if I'm supposed to add anything to my render file, but here is all related code to the entity file:

 

 

 

 

public class EntityArcher extends EntityMob implements IRangedAttackMob {

 

private static final ItemStack defaultHeldItem = new ItemStack(Items.bow, 1);

 

public EntityArcher(World par1World) {

super(par1World);

    float moveSpeed = 0.3F;

        this.tasks.addTask(7, new EntityAIArrowAttack(this, 0.25F, 15, 10.0F));       

        this.tasks.addTask(1, new EntityAISwimming(this));

        this.tasks.addTask(2, new EntityAIRestrictSun(this));

        this.tasks.addTask(3, new EntityAIFleeSun(this, moveSpeed));

        this.tasks.addTask(5, new EntityAIWander(this, moveSpeed));

        this.tasks.addTask(6, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F));

        this.tasks.addTask(6, new EntityAILookIdle(this));

        this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, false));

        this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 0, true));

this.setSize(0.6F, 1.5F);

 

  public boolean isAIEnabled()

    {

        return true;

    }

 

    public ItemStack getHeldItem()

    {

        return defaultHeldItem;

    }

 

 

@Override

public void attackEntityWithRangedAttack(EntityLivingBase var1, float f){

 

        EntityArrow var2 = new EntityArrow(this.worldObj, this, var1, 1.6F, 12.0F);

       

        var2.setDamage(4);

 

        this.playSound("random.bow", 1.0F, 1.0F / (this.getRNG().nextFloat() * 0.4F + 0.8F));

        this.worldObj.spawnEntityInWorld(var2);

    }

 

 

just looking at the source code i found this

 

strange its in an armour method but maybe it can help

 

    /**

    * Makes entity wear random armor based on difficulty

    */

    protected void addRandomArmor()

    {

        super.addRandomArmor();

        this.setCurrentItemOrArmor(0, new ItemStack(Items.bow));

    }

Can't remember the exact code, so this might be off, but you need to put a bow in the hand.

 

get rid of the line:

 

private static final ItemStack defaultHeldItem = new ItemStack(Items.bow, 1);

 

In your constructor Public EntityARcher after the setsize (by the way, looks like you are mising a "}" there), put something like this.  You really will have to check the syntax because I know my memory is off

 

this.setWeaponorEquipment(0, new Itemstack(Item.bow));

 

Long time Bukkit & Forge Programmer

Happy to try and help

  • Author

just looking at the source code i found this

 

strange its in an armour method but maybe it can help

 

    /**

    * Makes entity wear random armor based on difficulty

    */

    protected void addRandomArmor()

    {

        super.addRandomArmor();

        this.setCurrentItemOrArmor(0, new ItemStack(Items.bow));

    }

Unfortunately adding this didn't help, unless was I supposed to add this to the Render file?

 

Can't remember the exact code, so this might be off, but you need to put a bow in the hand.

 

get rid of the line:

 

private static final ItemStack defaultHeldItem = new ItemStack(Items.bow, 1);

 

In your constructor Public EntityARcher after the setsize (by the way, looks like you are mising a "}" there), put something like this.  You really will have to check the syntax because I know my memory is off

 

this.setWeaponorEquipment(0, new Itemstack(Item.bow));

setWeaponorEquipment doesn't appear to be a valid method.

As i said, i'm going off memory.

 

That is the right command, but you didn't put it where I told you to.

 

put

 

this.setCurrentItemOrArmor(0, new ItemStack(Items.bow));

 

where i mentioned in previous post.

 

Long time Bukkit & Forge Programmer

Happy to try and help

  • Author

As i said, i'm going off memory.

 

That is the right command, but you didn't put it where I told you to.

 

put

 

this.setCurrentItemOrArmor(0, new ItemStack(Items.bow));

 

where i mentioned in previous post.

So, it seems to have worked somewhat, as the mob now drops used bows, but I still don't see a visual bow being held.

Did you set up a custom render for your entity?

Long time Bukkit & Forge Programmer

Happy to try and help

Hmm, betting you didn't get all the render stuff in your custom mob render.

 

Compare yours to mine.  Mine works and shows the items.  The odd looking font code is so the name of the entity is over their head, but only when you are close to it.

 

Let me know if that helps.

 

 

 

 

package clandoolittle.custom_npc.Client.Render.Entities;

 

import cpw.mods.fml.relauncher.Side;

import cpw.mods.fml.relauncher.SideOnly;

import net.minecraft.block.Block;

import net.minecraft.client.entity.AbstractClientPlayer;

import net.minecraft.client.entity.EntityPlayerSP;

import net.minecraft.client.gui.FontRenderer;

import net.minecraft.client.model.ModelBiped;

import net.minecraft.client.renderer.RenderBlocks;

import net.minecraft.client.renderer.RenderHelper;

import net.minecraft.client.renderer.Tessellator;

import net.minecraft.client.renderer.entity.RenderBiped;

import net.minecraft.client.renderer.entity.RendererLivingEntity;

import net.minecraft.client.renderer.tileentity.TileEntitySkullRenderer;

import net.minecraft.entity.Entity;

import net.minecraft.entity.EntityLiving;

import net.minecraft.entity.EntityLivingBase;

import net.minecraft.entity.monster.EntityZombie;

import net.minecraft.entity.player.EntityPlayer;

import net.minecraft.item.EnumAction;

import net.minecraft.item.Item;

import net.minecraft.item.ItemArmor;

import net.minecraft.item.ItemBlock;

import net.minecraft.item.ItemStack;

import net.minecraft.scoreboard.Score;

import net.minecraft.scoreboard.ScoreObjective;

import net.minecraft.scoreboard.Scoreboard;

import net.minecraft.util.MathHelper;

import net.minecraft.util.ResourceLocation;

import net.minecraftforge.client.ForgeHooksClient;

import net.minecraftforge.client.IItemRenderer;

import net.minecraftforge.client.MinecraftForgeClient;

import net.minecraftforge.client.event.RenderPlayerEvent;

import net.minecraftforge.common.MinecraftForge;

 

import org.lwjgl.opengl.GL11;

 

import clandoolittle.custom_npc.Custom_NPC;

import clandoolittle.custom_npc.Common.Entities.Types.NPC_Entity;

import static net.minecraftforge.client.IItemRenderer.ItemRenderType.EQUIPPED;

import static net.minecraftforge.client.IItemRenderer.ItemRendererHelper.BLOCK_3D;

 

@SideOnly(Side.CLIENT)

public class MyRenderGuard extends RenderBiped

{

    // Setup Variables

    Custom_NPC instance = Custom_NPC.instance;

 

    // setup Variables

    private ResourceLocation texture = new ResourceLocation("custom_npc", instance.textures().textures.get("GUARD_BASIC.PNG"));

 

    public MyRenderGuard()

    {

        super(new ModelBiped(0.0F), 0.5F);

    }

 

    @Override

    protected ResourceLocation getEntityTexture(Entity entity)

    {

        // TODO Auto-generated method stub

        return texture;

    }

 

    @Override

    public void doRender(Entity par1Entity, double par2, double par4, double par6, float par8, float par9)

    {

        super.doRender(par1Entity, par2, par4, par6, par8, par9);

        // Setup Variables

        NPC_Entity npc = (NPC_Entity) par1Entity;

        // Render Name

        renderName(npc, npc.name(), par2, par4, par6, 64);

    }

 

    protected void renderName(EntityLivingBase par1EntityLivingBase, String par2Str, double par3, double par5, double par7, int par9)

    {

        double d3 = par1EntityLivingBase.getDistanceSqToEntity(this.renderManager.livingPlayer);

 

        if (d3 <= instance.properties().name_distance() * instance.properties().name_distance())

        {

            FontRenderer fontrenderer = this.getFontRendererFromRenderManager();

            float f = 1.6F;

            float f1 = 0.016666668F * f;

            GL11.glPushMatrix();

            GL11.glTranslatef((float)par3 + 0.0F, (float)par5 + par1EntityLivingBase.height + 0.5F, (float)par7);

            GL11.glNormal3f(0.0F, 1.0F, 0.0F);

            GL11.glRotatef(-this.renderManager.playerViewY, 0.0F, 1.0F, 0.0F);

            GL11.glRotatef(this.renderManager.playerViewX, 1.0F, 0.0F, 0.0F);

            GL11.glScalef(-f1, -f1, f1);

            GL11.glDisable(GL11.GL_LIGHTING);

            GL11.glDepthMask(false);

            GL11.glDisable(GL11.GL_DEPTH_TEST);

            GL11.glEnable(GL11.GL_BLEND);

            GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);

            Tessellator tessellator = Tessellator.instance;

            byte b0 = 0;

            GL11.glDisable(GL11.GL_TEXTURE_2D);

            tessellator.startDrawingQuads();

            int j = fontrenderer.getStringWidth(par2Str) / 2;

            tessellator.setColorRGBA_F(0.0F, 0.0F, 0.0F, 0.25F);

            tessellator.addVertex((double)(-j - 1), (double)(-1 + b0), 0.0D);

            tessellator.addVertex((double)(-j - 1), (double)(8 + b0), 0.0D);

            tessellator.addVertex((double)(j + 1), (double)(8 + b0), 0.0D);

            tessellator.addVertex((double)(j + 1), (double)(-1 + b0), 0.0D);

            tessellator.draw();

            GL11.glEnable(GL11.GL_TEXTURE_2D);

            fontrenderer.drawString(par2Str, -fontrenderer.getStringWidth(par2Str) / 2, b0, 553648127);

            GL11.glEnable(GL11.GL_DEPTH_TEST);

            GL11.glDepthMask(true);

            fontrenderer.drawString(par2Str, -fontrenderer.getStringWidth(par2Str) / 2, b0, -1);

            GL11.glEnable(GL11.GL_LIGHTING);

            GL11.glDisable(GL11.GL_BLEND);

            GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);

            GL11.glPopMatrix();

        }

    }

}

 

[\spoiler]

 

 

 

Long time Bukkit & Forge Programmer

Happy to try and help

  • Author

Hmm, betting you didn't get all the render stuff in your custom mob render.

 

Compare yours to mine.  Mine works and shows the items.  The odd looking font code is so the name of the entity is over their head, but only when you are close to it.

 

Let me know if that helps.

 

 

 

 

package clandoolittle.custom_npc.Client.Render.Entities;

 

import cpw.mods.fml.relauncher.Side;

import cpw.mods.fml.relauncher.SideOnly;

import net.minecraft.block.Block;

import net.minecraft.client.entity.AbstractClientPlayer;

import net.minecraft.client.entity.EntityPlayerSP;

import net.minecraft.client.gui.FontRenderer;

import net.minecraft.client.model.ModelBiped;

import net.minecraft.client.renderer.RenderBlocks;

import net.minecraft.client.renderer.RenderHelper;

import net.minecraft.client.renderer.Tessellator;

import net.minecraft.client.renderer.entity.RenderBiped;

import net.minecraft.client.renderer.entity.RendererLivingEntity;

import net.minecraft.client.renderer.tileentity.TileEntitySkullRenderer;

import net.minecraft.entity.Entity;

import net.minecraft.entity.EntityLiving;

import net.minecraft.entity.EntityLivingBase;

import net.minecraft.entity.monster.EntityZombie;

import net.minecraft.entity.player.EntityPlayer;

import net.minecraft.item.EnumAction;

import net.minecraft.item.Item;

import net.minecraft.item.ItemArmor;

import net.minecraft.item.ItemBlock;

import net.minecraft.item.ItemStack;

import net.minecraft.scoreboard.Score;

import net.minecraft.scoreboard.ScoreObjective;

import net.minecraft.scoreboard.Scoreboard;

import net.minecraft.util.MathHelper;

import net.minecraft.util.ResourceLocation;

import net.minecraftforge.client.ForgeHooksClient;

import net.minecraftforge.client.IItemRenderer;

import net.minecraftforge.client.MinecraftForgeClient;

import net.minecraftforge.client.event.RenderPlayerEvent;

import net.minecraftforge.common.MinecraftForge;

 

import org.lwjgl.opengl.GL11;

 

import clandoolittle.custom_npc.Custom_NPC;

import clandoolittle.custom_npc.Common.Entities.Types.NPC_Entity;

import static net.minecraftforge.client.IItemRenderer.ItemRenderType.EQUIPPED;

import static net.minecraftforge.client.IItemRenderer.ItemRendererHelper.BLOCK_3D;

 

@SideOnly(Side.CLIENT)

public class MyRenderGuard extends RenderBiped

{

    // Setup Variables

    Custom_NPC instance = Custom_NPC.instance;

 

    // setup Variables

    private ResourceLocation texture = new ResourceLocation("custom_npc", instance.textures().textures.get("GUARD_BASIC.PNG"));

 

    public MyRenderGuard()

    {

        super(new ModelBiped(0.0F), 0.5F);

    }

 

    @Override

    protected ResourceLocation getEntityTexture(Entity entity)

    {

        // TODO Auto-generated method stub

        return texture;

    }

 

    @Override

    public void doRender(Entity par1Entity, double par2, double par4, double par6, float par8, float par9)

    {

        super.doRender(par1Entity, par2, par4, par6, par8, par9);

        // Setup Variables

        NPC_Entity npc = (NPC_Entity) par1Entity;

        // Render Name

        renderName(npc, npc.name(), par2, par4, par6, 64);

    }

 

    protected void renderName(EntityLivingBase par1EntityLivingBase, String par2Str, double par3, double par5, double par7, int par9)

    {

        double d3 = par1EntityLivingBase.getDistanceSqToEntity(this.renderManager.livingPlayer);

 

        if (d3 <= instance.properties().name_distance() * instance.properties().name_distance())

        {

            FontRenderer fontrenderer = this.getFontRendererFromRenderManager();

            float f = 1.6F;

            float f1 = 0.016666668F * f;

            GL11.glPushMatrix();

            GL11.glTranslatef((float)par3 + 0.0F, (float)par5 + par1EntityLivingBase.height + 0.5F, (float)par7);

            GL11.glNormal3f(0.0F, 1.0F, 0.0F);

            GL11.glRotatef(-this.renderManager.playerViewY, 0.0F, 1.0F, 0.0F);

            GL11.glRotatef(this.renderManager.playerViewX, 1.0F, 0.0F, 0.0F);

            GL11.glScalef(-f1, -f1, f1);

            GL11.glDisable(GL11.GL_LIGHTING);

            GL11.glDepthMask(false);

            GL11.glDisable(GL11.GL_DEPTH_TEST);

            GL11.glEnable(GL11.GL_BLEND);

            GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);

            Tessellator tessellator = Tessellator.instance;

            byte b0 = 0;

            GL11.glDisable(GL11.GL_TEXTURE_2D);

            tessellator.startDrawingQuads();

            int j = fontrenderer.getStringWidth(par2Str) / 2;

            tessellator.setColorRGBA_F(0.0F, 0.0F, 0.0F, 0.25F);

            tessellator.addVertex((double)(-j - 1), (double)(-1 + b0), 0.0D);

            tessellator.addVertex((double)(-j - 1), (double)(8 + b0), 0.0D);

            tessellator.addVertex((double)(j + 1), (double)(8 + b0), 0.0D);

            tessellator.addVertex((double)(j + 1), (double)(-1 + b0), 0.0D);

            tessellator.draw();

            GL11.glEnable(GL11.GL_TEXTURE_2D);

            fontrenderer.drawString(par2Str, -fontrenderer.getStringWidth(par2Str) / 2, b0, 553648127);

            GL11.glEnable(GL11.GL_DEPTH_TEST);

            GL11.glDepthMask(true);

            fontrenderer.drawString(par2Str, -fontrenderer.getStringWidth(par2Str) / 2, b0, -1);

            GL11.glEnable(GL11.GL_LIGHTING);

            GL11.glDisable(GL11.GL_BLEND);

            GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);

            GL11.glPopMatrix();

        }

    }

}

 

[\spoiler]

 

This is my render file, and everything about it renders fine, except the item. Does it need to extend RenderBiped? Because I don't want it to be a biped model.

 

 

 

@SideOnly(Side.CLIENT)

public class RenderTyrano extends RenderLiving {

private static final ResourceLocation EntityTexture = new ResourceLocation("eternisles:textures/mobs/tyrano.png");

protected modelTyrano model;

 

public RenderTyrano(ModelBase par1ModelBase, float par2) {

super(par1ModelBase, par2);

model = ((modelTyrano)mainModel);

 

}

 

  public void renderTyrano(EntityLiving par1EntityLiving, double par2, double par4, double par6, float par8, float par9){

  renderTyrano((EntityTyrano)par1EntityLiving, par2, par4, par6, par8, par9);

     

  }

 

@Override

protected ResourceLocation getEntityTexture(Entity entity) {

 

return EntityTexture;

}

 

 

}

 

 

You need to use biped. 

 

You could do all the work to make a non biped show the weapon but honestly if you are asking these question you are not capable enough yet to do it.

Long time Bukkit & Forge Programmer

Happy to try and help

  • Author

You need to use biped. 

 

You could do all the work to make a non biped show the weapon but honestly if you are asking these question you are not capable enough yet to do it.

I think it's evident I don't know how to do it, that's why I am asking here.

  • Author

Still can't seem to get it to work, and I don't know how to make the Render extend biped while not being a biped.

 

My render file:

 

 

 

 

@SideOnly(Side.CLIENT)

public class RenderTyrano extends RenderLiving {

private static final ResourceLocation EntityTexture = new ResourceLocation("eternisles:textures/mobs/tyrano.png");

protected modelTyrano model;

 

  public RenderTyrano(ModelBase par1ModelBase, float par2) {

      super(par1ModelBase, par2);

      model = ((modelTyrano)mainModel);

     

  }

 

      public void renderTyrano(EntityLiving par1EntityLiving, double par2, double par4, double par6, float par8, float par9){

        renderTyrano((EntityTyrano)par1EntityLiving, par2, par4, par6, par8, par9);

       

      }

 

  @Override

  protected ResourceLocation getEntityTexture(Entity entity) {

     

      return EntityTexture;

  }

 

 

}

 

 

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...

Important Information

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

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.