Tutoriel Item dans la main gauche de votre mob [Aussi joueurs]

  • Auteur de la discussion Auteur de la discussion elias54
  • Date de début Date de début

Ce tutoriel vous a t-il été utile ?


  • Total voters
    22

elias54

Graph & dev MFF
17 Juillet 2011
465
45
135
26
Salut à tous et à toutes, c'est elias54.

Beaucoup de personnes cherchent comment faire pour que votre mob humain aie un item dans sa main gauche. Et bien ces personnes vont être ravis, car ce tuto va vous montrer comment faire pour que votre mob tienne un item dans la main gauche.

Bref, commençons !



On va prendre un Assassin comme exemple ! :D



Donc voici le code de l'EntityAssassin:

Code:
package net.minecraft.src;
 
import java.util.*;
 
//CLIENT
public class EntityAssassin extends EntityCreature
{
    private static final ItemStack defaultHeldItem;
  private int attackStrength;
  public boolean renderOffhand;
  private PathEntity pathToEntity;
 
    public EntityAssassin(World world)
    {
        super(world);
        texture = "/mob/assassin.png";
        moveSpeed = 0.65F;
        attackStrength = 5;
        health = 70;
    }
    protected void updateEntityActionState()
    {
        super.updateEntityActionState();
        if(entityToAttack == null && !hasPath() && worldObj.rand.nextInt(10) == 0)
        {
            List list = worldObj.getEntitiesWithinAABB(EntityMob.class, AxisAlignedBB.getBoundingBoxFromPool(posX, posY, posZ, posX + 1.0D, posY + 1.0D, posZ + 1.0D).expand(14D, 2D, 14D));
            if(!list.isEmpty())
            {
                setEntityToAttack((EntityMob)list.get(worldObj.rand.nextInt(list.size())));
            }
        }
    }
    protected void attackBlockedEntity(Entity entity, float f)
    {
      this.setEntityToAttack(entityToAttack);
    }
    public void setPathToEntity(PathEntity pathentity)
    {
        pathToEntity = pathentity;
    }
 
    public Entity getEntityToAttack()
    {
        return entityToAttack;
    }
    public void setEntityToAttack(Entity entity)
    {
        entityToAttack = entity;
    }
  public ItemStack getHeldItem()
    {
        return defaultHeldItem;
    }
 
    static
    {
        defaultHeldItem = new ItemStack(Item.swordSteel, 1);
    }
    public int getMaxHealth()
    {
        return health;
    }
    public boolean attackEntityAsMob(Entity par1Entity)
    {
        int i = attackStrength;
        if (isPotionActive(Potion.damageBoost))
        {
            i += 3 << getActivePotionEffect(Potion.damageBoost).getAmplifier();
        }
 
        if (isPotionActive(Potion.weakness))
        {
            i -= 2 << getActivePotionEffect(Potion.weakness).getAmplifier();
        }
 
        return par1Entity.attackEntityFrom(DamageSource.causeMobDamage(this), i);
    }
    public void writeEntityToNBT(NBTTagCompound nbttagcompound)
    {
        super.writeEntityToNBT(nbttagcompound);
    }
 
    public void readEntityFromNBT(NBTTagCompound nbttagcompound)
    {
        super.readEntityFromNBT(nbttagcompound);
    }
    public void onDeath(DamageSource damagesource)
    {
        if (rand.nextInt(50) == 0)
        {
            dropItem(Item.diamond.shiftedIndex, rand.nextInt(2) + 1);
        }
 
        if (rand.nextInt(50) == 0)
        {
            entityDropItem(new ItemStack(Item.bone, 1, 3), 1.0F);
        }
 
        if (rand.nextInt(50) == 0)
        {
            entityDropItem(new ItemStack(Item.book, 1, 1), 1.0F);
        }
 
        if (rand.nextInt(2) == 0)
        {
            dropItem(Item.ingotIron.shiftedIndex, rand.nextInt(5) + 2);
        }
        else
        {
            dropItem(Item.appleRed.shiftedIndex, 1);
        }
        super.onDeath(damagesource);
    }
    protected void attackEntity(Entity par1Entity, float par2)
    {
        if (attackTime <= 0 && par2 < 2.0F && par1Entity.boundingBox.maxY > boundingBox.minY && par1Entity.boundingBox.minY < boundingBox.maxY)
        {
            attackTime = 20;
            this.attackEntityAsMob(par1Entity);
        }
        if((double)par2 < 2D && par1Entity.boundingBox.maxY > boundingBox.minY && par1Entity.boundingBox.minY < boundingBox.maxY)
        {
       
        }
    }
    public ItemStack getOffHandItem()
    {
            return offhandItems;
    }
    static
    {
      offhandItems = new ItemStack(Item.swordDiamond, 1);
    }
    private int offhandItem;
    protected static ItemStack offhandItems;
}

Dans ce tuto, seul la méthode public ItemStack getOffHandItem() et le int private int offhandItem; et enfin le boolean public boolean renderOffhand;







Développons :


private int offhandItem; = C'est un int qui va être utilisé pour dire au jeu : Il y aura un item dans l'autre main !
protected static ItemStack offhandItems; = Ce static va être utilisé dans la méthode que je vous montrerai plus bas
public boolean renderOffhand; = Ce boolean va être utilisé dans le RenderAssassin que je vous montrerai plus bas

Ok, c'est super ça, mais comment qu'ça fonctionne ?

Et ben c'est simple; dans EntityAssassin, nous allons importer les variables que j'ai décris ci-dessus, comme ceci :

Code:
private int offhandItem;
protected static ItemStack offhandItems;
public boolean renderOffhand;

Ensuite, mettez-y ces méthodes :

Code:
    public ItemStack getOffHandItem()
    {
            return offhandItems;
    }
Code:
    static
    {
      offhandItems = new ItemStack(Item.swordDiamond, 1);
    }

Et voilà ! Nous en avons fini avec cette partie du tutoriel ! Maintenant passons au Render !

Donc, voilà le fichier RenderAssassin:

Code:
package net.minecraft.src;
 
import org.lwjgl.opengl.GL11;
 
public class RenderAssassin extends RenderLiving
{
    protected ModelAssassin modelBipedMain;
    protected float field_40296_d;
 
    public RenderAssassin(ModelAssassin par1ModelBiped, float par2)
    {
        this(par1ModelBiped, par2, 1.0F);
        modelBipedMain = par1ModelBiped;
    }
 
    public RenderAssassin(ModelAssassin par1ModelBiped, float par2, float par3)
    {
        super(par1ModelBiped, par2);
        modelBipedMain = par1ModelBiped;
        field_40296_d = par3;
    }
 
    protected void renderEquippedItems(EntityLiving par1EntityLiving, float par2)
    {
        super.renderEquippedItems(par1EntityLiving, par2);
        ItemStack itemstack = par1EntityLiving.getHeldItem();
        if (itemstack != null)
        {
       
            GL11.glPushMatrix();
            modelBipedMain.bipedRightArm.postRender(0.0625F);
            GL11.glTranslatef(-0.0625F, 0.4375F, 0.0625F);
 
            if (itemstack.itemID < 256 && RenderBlocks.renderItemIn3d(Block.blocksList[itemstack.itemID].getRenderType()))
            {
                float f = 0.5F;
                GL11.glTranslatef(0.0F, 0.1875F, -0.3125F);
                f *= 0.75F;
                GL11.glRotatef(20F, 1.0F, 0.0F, 0.0F);
                GL11.glRotatef(45F, 0.0F, 1.0F, 0.0F);
                GL11.glScalef(f, -f, f);
            }
            else if (itemstack.itemID == Item.bow.shiftedIndex)
            {
                float f1 = 0.625F;
                GL11.glTranslatef(0.0F, 0.125F, 0.3125F);
                GL11.glRotatef(-20F, 0.0F, 1.0F, 0.0F);
                GL11.glScalef(f1, -f1, f1);
                GL11.glRotatef(-100F, 1.0F, 0.0F, 0.0F);
                GL11.glRotatef(45F, 0.0F, 1.0F, 0.0F);
            }
            else if (Item.itemsList[itemstack.itemID].isFull3D())
            {
                float f2 = 0.625F;
                GL11.glTranslatef(0.0F, 0.1875F, 0.0F);
                GL11.glScalef(f2, -f2, f2);
                GL11.glRotatef(-100F, 1.0F, 0.0F, 0.0F);
                GL11.glRotatef(45F, 0.0F, 1.0F, 0.0F);
            }
            else
            {
                float f3 = 0.375F;
                GL11.glTranslatef(0.25F, 0.1875F, -0.1875F);
                GL11.glScalef(f3, f3, f3);
                GL11.glRotatef(60F, 0.0F, 0.0F, 1.0F);
                GL11.glRotatef(-90F, 1.0F, 0.0F, 0.0F);
                GL11.glRotatef(20F, 0.0F, 0.0F, 1.0F);
            }
 
            renderManager.itemRenderer.renderItem(par1EntityLiving, itemstack, 0);
 
            if (itemstack.getItem().func_46058_c())
            {
                renderManager.itemRenderer.renderItem(par1EntityLiving, itemstack, 1);
            }
 
            GL11.glPopMatrix();
        }
        EntityAssassin assassin = (EntityAssassin)par1EntityLiving;
        ItemStack itemstack1 = assassin.getOffHandItem();
        if (itemstack1 != null)
        {
       
            GL11.glPushMatrix();
            modelBipedMain.bipedLeftArm.postRender(0.0625F);
            GL11.glTranslatef(0.0625F, 0.4375F, 0.0625F);
 
            if (itemstack1.itemID < 256 && RenderBlocks.renderItemIn3d(Block.blocksList[itemstack1.itemID].getRenderType()))
            {
                float f = 0.5F;
                GL11.glTranslatef(0.0F, 0.1875F, -0.3125F);
                f *= 0.75F;
                GL11.glRotatef(20F, 1.0F, 0.0F, 0.0F);
                GL11.glRotatef(45F, 0.0F, 1.0F, 0.0F);
                GL11.glScalef(f, -f, f);
            }
            else if (Item.itemsList[itemstack1.itemID].isFull3D())
            {
                float f2 = 0.625F;
                GL11.glTranslatef(0.0F, 0.1875F, 0.0F);
                GL11.glScalef(f2, -f2, f2);
                GL11.glRotatef(-100F, 1.0F, 0.0F, 0.0F);
                GL11.glRotatef(45F, 0.0F, 1.0F, 0.0F);
            }
            else
            {
                float f3 = 0.375F;
                GL11.glTranslatef(0.25F, 0.1875F, -0.1875F);
                GL11.glScalef(f3, f3, f3);
                GL11.glRotatef(60F, 0.0F, 0.0F, 1.0F);
                GL11.glRotatef(-90F, 1.0F, 0.0F, 0.0F);
                GL11.glRotatef(20F, 0.0F, 0.0F, 1.0F);
            }
 
            renderManager.itemRenderer.renderItem(par1EntityLiving, itemstack1, 0);
 
            if (itemstack1.getItem().func_46058_c())
            {
                renderManager.itemRenderer.renderItem(par1EntityLiving, itemstack1, 1);
            }
 
            GL11.glPopMatrix();
        }
    }
 
 
    protected ModelAssassin modelHumanMain;
}

Oui, une nouvelle méthode fait son apparition : protected void renderEquippedItems(EntityLiving par1EntityLiving, float par2)

A quoi sert cette méthode ?

Cette méthode va permettre, comme son nom l'indique, de voir le mob avec un item équipé. Elle est aussi utiliser pour la main droite !

De base, la méthode n'est pas si grande que ça. Mais je vais vous expliquer pourquoi elle est grande.

Dans la méthode, nous avons cette ligne de "ItemStack" et ce "if" :
Code:
        ItemStack itemstack = par1EntityLiving.getHeldItem();
        if (itemstack != null)
        {
       
            GL11.glPushMatrix();
            modelBipedMain.bipedRightArm.postRender(0.0625F);
            GL11.glTranslatef(-0.0625F, 0.4375F, 0.0625F);
 
            if (itemstack.itemID < 256 && RenderBlocks.renderItemIn3d(Block.blocksList[itemstack.itemID].getRenderType()))
            {
                float f = 0.5F;
                GL11.glTranslatef(0.0F, 0.1875F, -0.3125F);
                f *= 0.75F;
                GL11.glRotatef(20F, 1.0F, 0.0F, 0.0F);
                GL11.glRotatef(45F, 0.0F, 1.0F, 0.0F);
                GL11.glScalef(f, -f, f);
            }
            else if (itemstack.itemID == Item.bow.shiftedIndex)
            {
                float f1 = 0.625F;
                GL11.glTranslatef(0.0F, 0.125F, 0.3125F);
                GL11.glRotatef(-20F, 0.0F, 1.0F, 0.0F);
                GL11.glScalef(f1, -f1, f1);
                GL11.glRotatef(-100F, 1.0F, 0.0F, 0.0F);
                GL11.glRotatef(45F, 0.0F, 1.0F, 0.0F);
            }
            else if (Item.itemsList[itemstack.itemID].isFull3D())
            {
                float f2 = 0.625F;
                GL11.glTranslatef(0.0F, 0.1875F, 0.0F);
                GL11.glScalef(f2, -f2, f2);
                GL11.glRotatef(-100F, 1.0F, 0.0F, 0.0F);
                GL11.glRotatef(45F, 0.0F, 1.0F, 0.0F);
            }
            else
            {
                float f3 = 0.375F;
                GL11.glTranslatef(0.25F, 0.1875F, -0.1875F);
                GL11.glScalef(f3, f3, f3);
                GL11.glRotatef(60F, 0.0F, 0.0F, 1.0F);
                GL11.glRotatef(-90F, 1.0F, 0.0F, 0.0F);
                GL11.glRotatef(20F, 0.0F, 0.0F, 1.0F);
            }
 
            renderManager.itemRenderer.renderItem(par1EntityLiving, itemstack, 0);
 
            if (itemstack.getItem().func_46058_c())
            {
                renderManager.itemRenderer.renderItem(par1EntityLiving, itemstack, 1);
            }
 
            GL11.glPopMatrix();
        }
Ce code va dire au jeu que si le mob a un Item dans la main DROITE, qu'il soit affiché, car sinon, vous le verrez sans item dans la main.

Génial ! Mais pourquoi as-tu refait le même "if" ?

Parce que JUSTEMENT ! Ce 2nd "if" va permettre d'ajouter un second render d'item dans la main, et ce, dans la main gauche

Voici le code du 2nd "if" :
Code:
        EntityAssassin assassin = (EntityAssassin)par1EntityLiving;
        ItemStack itemstack1 = assassin.getOffHandItem();
        if (itemstack1 != null)
        {
       
            GL11.glPushMatrix();
            modelBipedMain.bipedLeftArm.postRender(0.0625F);
            GL11.glTranslatef(0.0625F, 0.4375F, 0.0625F);
 
            if (itemstack1.itemID < 256 && RenderBlocks.renderItemIn3d(Block.blocksList[itemstack1.itemID].getRenderType()))
            {
                float f = 0.5F;
                GL11.glTranslatef(0.0F, 0.1875F, -0.3125F);
                f *= 0.75F;
                GL11.glRotatef(20F, 1.0F, 0.0F, 0.0F);
                GL11.glRotatef(45F, 0.0F, 1.0F, 0.0F);
                GL11.glScalef(f, -f, f);
            }
            else if (Item.itemsList[itemstack1.itemID].isFull3D())
            {
                float f2 = 0.625F;
                GL11.glTranslatef(0.0F, 0.1875F, 0.0F);
                GL11.glScalef(f2, -f2, f2);
                GL11.glRotatef(-100F, 1.0F, 0.0F, 0.0F);
                GL11.glRotatef(45F, 0.0F, 1.0F, 0.0F);
            }
            else
            {
                float f3 = 0.375F;
                GL11.glTranslatef(0.25F, 0.1875F, -0.1875F);
                GL11.glScalef(f3, f3, f3);
                GL11.glRotatef(60F, 0.0F, 0.0F, 1.0F);
                GL11.glRotatef(-90F, 1.0F, 0.0F, 0.0F);
                GL11.glRotatef(20F, 0.0F, 0.0F, 1.0F);
            }
 
            renderManager.itemRenderer.renderItem(par1EntityLiving, itemstack1, 0);
 
            if (itemstack1.getItem().func_46058_c())
            {
                renderManager.itemRenderer.renderItem(par1EntityLiving, itemstack1, 1);
            }
 
            GL11.glPopMatrix();
        }
    }
 
 
    protected ModelAssassin modelHumanMain;

Les modifications dans le 2nd "if" :

EntityAssassin assassin = (EntityAssassin)par1EntityLiving;
ItemStack itemstack1 = assassin.getOffHandItem();
Eh oui, il est important de changer ces lignes, sinon, ça ne fonctionnera pas !

Ensuite, vous aurez à remplacer TOUS les itemstack (bien en minuscule) par itemstack1.

Pourquoi ?

Parce que sinon, cela ne fonctionnera pas, quand je vous ai dit ci-dessus qu'il était important de changer les lignes avec "EntityAssassin etc..." surtout !!! Je dis bien SURTOUT !!! Regardez bien les différence entre le 1er "if" et le 2nd ! Parce que si vous mettez "itemstack" sans le "1" qui suit, vous aurez plus qu'a recommencer ! Donc pensez bien à remplacer "itemstack" par "itemstack1" dans le 2nd "if" que je vous ai montré !

Ensuite, nous avons ça :

Code:
modelBipedMain.bipedLeftArm.postRender(0.0625F);
  GL11.glTranslatef(0.0625F, 0.4375F, 0.0625F);

modelBipedMain.bipedLeftArm.postRender(0.0625F); = Va permettre d'indiquer quel est le bras gauche du mob et aussi le lever un petit peu pour montrer que le mob tien un item

GL11.glTranslatef(0.0625F, 0.4375F, 0.0625F); = C'est un peu dure à expliquer mais je vais essayer, c'est la position de l'Item quand le mob le tiendra ! :p

Résultat :
1333279009-2012-03-31_23.36.09.png

Bon, j'en ai enfin fini avec le tutoriel ! :)

POUR INFO, SUR LE SCREEN, C'EST BIEN UN MOB ET NON LE JOUEUR :D

Si malgré tout vous avez des erreurs ou bugs, je vous donne les sources en téléchargement.

Cliquez ICI
 
ça marche uniquement en solo ou aussi multi ?
Si oui, en multi ta main gauche est inutilisable, juste de la déco non ?
 
ben, à la base c'est fait pour les mobs et non le joueur ^^ donc normalement oui x)
 
Et les armes sont fonctionnelles ?
Où tu tape juste avec la droite et la gauche fait joli ?
 
Pour le joueur, enfaîte, c'est pas moi qui ai test, va voir le topic sur ironcraft que j'ai fait :P