Jump to content

Mob holds item, but I can't see it.


HappleAcks

Recommended Posts

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);

    }

 

 

Link to comment
Share on other sites

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));

    }

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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;

}

 

 

}

 

 

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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;

  }

 

 

}

 

 

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.

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



×
×
  • Create New...

Important Information

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