Donner un apparence à une Entité + Système d'argent

Mack

Architecte en herbe
3 Juin 2011
123
5
124
Salut,
Je suis en train de faire un mod, et j'aurais besoin d'aide :
Comment je fait pour attribuer un render à une Entitée ?
En faite, j'ai créer un couteau de lancer, mais quand je le lance, c'est un carré blanc qui part. Moi je voudrais que ça soit l'icone de l'arme. Comment je doit faire ?

De plus, j'aurais une autre question :
J'aimerais faire un mod qui permettrais de gagner de l'argent lorsque l'on tue les monstres ( De la même façon que les PX : Quand le monstre meurt, il lâche une ou plusieurs pièce et lorsque le joueurs les ramasse, elles augmentent un compteur. )
Et après, on active un bloc qui ouvre une interface plus ou moins comme celle de l'inventaire, mais qui permet d'acheter les blocs et les objets.
J'ai donc chercher dans les fichiers source que donne MCP, mais impossible de comprendre quelle fichier gère la boule qui spawn à la mort des monstres ...
Je cherche donc un moyen de faire un truc similaire.
( J'avais pensé à regarder le code de EntityItem, j'ai donc fait ça :
Code:
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3) braces deadcode

package net.minecraft.src;

import java.util.Random;

// Referenced classes of package net.minecraft.src:
//            Entity, MathHelper, World, Material,
//            AxisAlignedBB, Block, DamageSource, NBTTagCompound,
//            ItemStack, EntityPlayer, InventoryPlayer, AchievementList,
//            Item, ModLoader

public class EntityGold extends Entity
{

    public EntityGold(World world, double d, double d1, double d2)
    {
        super(world);
        age = 0;
        health = 5;
        field_804_d = (float)(Math.random() * 3.1415926535897931D * 2D);
        setSize(0.25F, 0.25F);
        yOffset = height / 2.0F;
        setPosition(d, d1, d2);
        item = new ItemStack(Item.arrow, 1); // itemstack;
        rotationYaw = (float)(Math.random() * 360D);
        motionX = (float)(Math.random() * 0.20000000298023221D - 0.10000000149011611D);
        motionY = 0.20000000298023221D;
        motionZ = (float)(Math.random() * 0.20000000298023221D - 0.10000000149011611D);
    }

    protected boolean canTriggerWalking()
    {
        return false;
    }

    public EntityGold(World world)
    {
        super(world);
        age = 0;
        health = 5;
        field_804_d = (float)(Math.random() * 3.1415926535897931D * 2D);
        setSize(0.25F, 0.25F);
        yOffset = height / 2.0F;
    }

    protected void entityInit()
    {
    }

    public void onUpdate()
    {
        super.onUpdate();
        if(delayBeforeCanPickup > 0)
        {
            delayBeforeCanPickup--;
        }
        prevPosX = posX;
        prevPosY = posY;
        prevPosZ = posZ;
        motionY -= 0.039999999105930328D;
        if(worldObj.getBlockMaterial(MathHelper.floor_double(posX), MathHelper.floor_double(posY), MathHelper.floor_double(posZ)) == Material.lava)
        {
            motionY = 0.20000000298023221D;
            motionX = (rand.nextFloat() - rand.nextFloat()) * 0.2F;
            motionZ = (rand.nextFloat() - rand.nextFloat()) * 0.2F;
            worldObj.playSoundAtEntity(this, "random.fizz", 0.4F, 2.0F + rand.nextFloat() * 0.4F);
        }
        pushOutOfBlocks(posX, (boundingBox.minY + boundingBox.maxY) / 2D, posZ);
        moveEntity(motionX, motionY, motionZ);
        float f = 0.98F;
        if(onGround)
        {
            f = 0.5880001F;
            int i = worldObj.getBlockId(MathHelper.floor_double(posX), MathHelper.floor_double(boundingBox.minY) - 1, MathHelper.floor_double(posZ));
            if(i > 0)
            {
                f = Block.blocksList[i].slipperiness * 0.98F;
            }
        }
        motionX *= f;
        motionY *= 0.98000001907348633D;
        motionZ *= f;
        if(onGround)
        {
            motionY *= -0.5D;
        }
        field_803_e++;
        age++;
        if(age >= 6000)
        {
            setEntityDead();
        }
    }

    public boolean handleWaterMovement()
    {
        return worldObj.handleMaterialAcceleration(boundingBox, Material.water, this);
    }

    protected void dealFireDamage(int i)
    {
        attackEntityFrom(DamageSource.field_35542_a, i);
    }

    public boolean attackEntityFrom(DamageSource damagesource, int i)
    {
        setBeenAttacked();
        health -= i;
        if(health <= 0)
        {
            setEntityDead();
        }
        return false;
    }

    public void writeEntityToNBT(NBTTagCompound nbttagcompound)
    {
        nbttagcompound.setShort("Health", (byte)health);
        nbttagcompound.setShort("Age", (short)age);
        nbttagcompound.setCompoundTag("Item", item.writeToNBT(new NBTTagCompound()));
    }

    public void readEntityFromNBT(NBTTagCompound nbttagcompound)
    {
        health = nbttagcompound.getShort("Health") & 0xff;
        age = nbttagcompound.getShort("Age");
        NBTTagCompound nbttagcompound1 = nbttagcompound.getCompoundTag("Item");
        item = ItemStack.func_35864_a(nbttagcompound1);
        if(item == null)
        {
            setEntityDead();
        }
    }

    public void onCollideWithPlayer(EntityPlayer entityplayer)
    {
        if(worldObj.multiplayerWorld)
        {
            return;
        }
        int i = item.stackSize;
        if(delayBeforeCanPickup == 0 && entityplayer.inventory.addItemStackToInventory(item))
        {

            ModLoader.OnItemPickup(entityplayer, item);
            worldObj.playSoundAtEntity(this, "random.pop", 0.2F, ((rand.nextFloat() - rand.nextFloat()) * 0.7F + 1.0F) * 2.0F);
            entityplayer.onItemPickup(this, i);
            if(item.stackSize <= 0)
            {
                setEntityDead();
            }
        }
    }

    public ItemStack item;
    private int field_803_e;
    public int age;
    public int delayBeforeCanPickup;
    private int health;
    public float field_804_d;
}
Mais l'objet apparaît directement dans l'inventaire, alors qu'il devrais partir comme une flèche( J'les ai fait spawner par un objet similaire à l'arc ( Une dague de lancer ). SI je fait que c'est la dague qui doit partir, ça marche, mais si je fait que c'est mon EntityGold, ça marche pas. ) ...
Voila, donc déjà, si j'arrivais à faire le compteur, avec les entitées qui spawn à la mort des monstres, ça serais cool. J'm'occuperais du bloc marchant en dernier.

Merci d'avance.
 
Je m'y connais pas trop en mods, mais t'as essayé de mettre le render de ton couteau dans item.png et d'y associer cette image dans ton code?
Si tu comprends ce que je veux dire...
 
C'est justement ça le problème ><.

Sinon, j'ai réussis à créer le EntityGold.
Mais le même problème qu'au dessus se pose :
J'ai juste un carré blanc qui représente la pièce ...
 
bah dans ton code tu as une ligne comme ceci normalement:
public static final Block
myBloc = (new BlockMyBloc(99,224)).setHardness(2.0F)
Avec 224 qui correspond à l'emplacement de la texture dans "terrain.png", du coup tu modifies ton "terrain.png" sur un emplacement libre, et tu changes 224 par le numéro de l'emplacement correspondant.
Après ça c'est pour un bloc mais il me semble que c'est pareil pour un item.
 
Bah ... Ouais.
Mais seulement pour son icône. Donc l'image dans l'inventaire, et dans la main.

EDIT : Finalement, j'ai trouver pour le Render.
Me reste donc plus que l'interface.
 
Bon, je rencontre un autre problème :
Lorsque je lance reobfuscate.bat pour essayer mon mod sur une vraie version de Minecraft, tout se passe bien, aucune erreur, et je récupère bien les fichiers de mon mod.
Je met mes fichier dans mon minecraft.jar ( J'ai prix un neuf ), mais dès que j'essaie mes recettes ... Rien ne se passe =/.
Je comprend pas pourquoi .. Pourtant lors du test avec MCP y a aucun problème, mon Mod marche très bien ...
De plus, dans mon mod j'ai rajouté une touche, et lors du vrai jeu dans le menu config la touche apparaît bien, mais y a rien qui se passe ...

Voila un rar avec les fichiers sources, et les fichiers obtenu après le reo :
http://www.megaupload.com/?d=N5G2L288

EDIT :
Bon, maintenant, quand je met les fichier dans mon .jar, ça me donne une page d'erreur après le splashscreen de Mojang ... Puis avant d'avoir le temps de lire ça devient tout noir ...

EDIT 2 :

Bon, j'continue sur ma lancée, j'ai presque réussis à faire mon GUI D'achat.
Voila donc le code :
Code:
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3) braces deadcode

package net.minecraft.src;

import java.util.List;
import net.minecraft.client.Minecraft;
import org.lwjgl.input.Keyboard;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL13;
 
// Referenced classes of package net.minecraft.src:
//            GuiScreen, EntityPlayerSP, RenderHelper, Container,
//            Slot, InventoryPlayer, RenderItem, StringTranslate,
//            ItemStack, FontRenderer, RenderEngine, PlayerController,
//            GameSettings, KeyBinding

public class GuiSeller extends GuiScreen
{

    public GuiSeller(Container container)
    {
        xSize = 176;
        ySize = 166;
    original_container = container;
        inventorySlots = container;
        allowUserInput = true;
    inventoryRows = 4;
    }

    private int inventoryRows;

    public void initGui()
    {
        controlList.clear();
    }

    public void drawScreen(int i, int j, float f)
    {
        drawDefaultBackground();
        int k = (width - xSize) / 2;
        int l = (height - ySize) / 2;
        drawGuiContainerBackgroundLayer(f);
        GL11.glPushMatrix();
        GL11.glRotatef(120F, 1.0F, 0.0F, 0.0F);
        RenderHelper.enableStandardItemLighting();
        GL11.glPopMatrix();
        GL11.glPushMatrix();
        GL11.glTranslatef(k, l, 0.0F);
        GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
        GL11.glEnable(32826 /*GL_RESCALE_NORMAL_EXT*/);
        Slot slot = null;
        int i1 = 240;
        int k1 = 240;
        GL13.glMultiTexCoord2f(33985 /*GL_TEXTURE1_ARB*/, (float)i1 / 1.0F, (float)k1 / 1.0F);
        GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
        for(int j1 = 0; j1 < inventorySlots.inventorySlots.size(); j1++)
        {
            Slot slot1 = (Slot)inventorySlots.inventorySlots.get(j1);
            drawSlotInventory(slot1);
            if(getIsMouseOverSlot(slot1, i, j))
            {
                slot = slot1;
                GL11.glDisable(2896 /*GL_LIGHTING*/);
                GL11.glDisable(2929 /*GL_DEPTH_TEST*/);
                int l1 = slot1.xDisplayPosition;
                int j2 = slot1.yDisplayPosition;
                drawGradientRect(l1, j2, l1 + 16, j2 + 16, 0x80ffffff, 0x80ffffff);
                GL11.glEnable(2896 /*GL_LIGHTING*/);
                GL11.glEnable(2929 /*GL_DEPTH_TEST*/);
            }
        }

        InventoryPlayer inventoryplayer = mc.thePlayer.inventory;
        if(inventoryplayer.getItemStack() != null)
        {
            GL11.glTranslatef(0.0F, 0.0F, 32F);
            itemRenderer.renderItemIntoGUI(fontRenderer, mc.renderEngine, inventoryplayer.getItemStack(), i - k - 8, j - l - 8);
            itemRenderer.renderItemOverlayIntoGUI(fontRenderer, mc.renderEngine, inventoryplayer.getItemStack(), i - k - 8, j - l - 8);
        }
        GL11.glDisable(32826 /*GL_RESCALE_NORMAL_EXT*/);
        RenderHelper.disableStandardItemLighting();
        GL11.glDisable(2896 /*GL_LIGHTING*/);
        GL11.glDisable(2929 /*GL_DEPTH_TEST*/);
        drawGuiContainerForegroundLayer();
        if(inventoryplayer.getItemStack() == null && slot != null && slot.getHasStack())
        {
            String s = (new StringBuilder()).append("").append(StringTranslate.getInstance().translateNamedKey(slot.getStack().getItemName())).toString().trim();
        s += "  -  Prix :"+slot.getStack().getItemPrice();
            if(s.length() > 0)
            {
                int i2 = (i - k) + 12;
                int k2 = j - l - 12;
                int l2 = fontRenderer.getStringWidth(s);
                drawGradientRect(i2 - 3, k2 - 3, i2 + l2 + 3, k2 + 8 + 3, 0xc0000000, 0xc0000000);
                fontRenderer.drawStringWithShadow(s, i2, k2, -1);
            }
        }
        GL11.glPopMatrix();
        super.drawScreen(i, j, f);
        GL11.glEnable(2896 /*GL_LIGHTING*/);
        GL11.glEnable(2929 /*GL_DEPTH_TEST*/);
        xSize_lo = i;
        ySize_lo = j;
    }
    protected void drawGuiContainerBackgroundLayer(float f)
    {
        int i = mc.renderEngine.getTexture("/gui/container.png");
        GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
        mc.renderEngine.bindTexture(i);
        int j = (width - xSize) / 2;
        int k = (height - ySize) / 2;
        drawTexturedModalRect(j, k, 0, 0, xSize, inventoryRows * 18 + 17);
        drawTexturedModalRect(j, k + inventoryRows * 18 + 17, 0, 126, xSize, 96);
    }
    protected void drawGuiContainerForegroundLayer()
    {
    fontRenderer.drawString("Pièce : "+mc.thePlayer.gold, 8, 6, 0x404040);
    }
    protected void actionPerformed(GuiButton guibutton)
    {
    }

    private float xSize_lo;
    private float ySize_lo;

    private void drawSlotInventory(Slot slot)
    {
        int i = slot.xDisplayPosition;
        int j = slot.yDisplayPosition;
        ItemStack itemstack = slot.getStack();
        if(itemstack == null)
        {
            int k = slot.getBackgroundIconIndex();
            if(k >= 0)
            {
                GL11.glDisable(2896 /*GL_LIGHTING*/);
                mc.renderEngine.bindTexture(mc.renderEngine.getTexture("/gui/items.png"));
                drawTexturedModalRect(i, j, (k % 16) * 16, (k / 16) * 16, 16, 16);
                GL11.glEnable(2896 /*GL_LIGHTING*/);
                return;
            }
        }
        itemRenderer.renderItemIntoGUI(fontRenderer, mc.renderEngine, itemstack, i, j);
        itemRenderer.renderItemOverlayIntoGUI(fontRenderer, mc.renderEngine, itemstack, i, j);
    }

    private Slot getSlotAtPosition(int i, int j)
    {
        for(int k = 0; k < inventorySlots.inventorySlots.size(); k++)
        {
            Slot slot = (Slot)inventorySlots.inventorySlots.get(k);
            if(getIsMouseOverSlot(slot, i, j))
            {
                return slot;
            }
        }

        return null;
    }

protected void mouseClicked(int i, int j, int k)
    {
        super.mouseClicked(i, j, k);
        if(k == 0 || k == 1)
        {
            Slot slot = getSlotAtPosition(i, j);
            int l = (width - xSize) / 2;
            int i1 = (height - ySize) / 2;
            boolean flag = i < l || j < i1 || i >= l + xSize || j >= i1 + ySize;
            int j1 = -1;
            if(slot != null)
            {
                j1 = slot.slotNumber;
            }
            if(flag)
            {
                j1 = -999;
            }
            if(j1 != -1)
            {
                boolean flag1 = j1 != -999 && (Keyboard.isKeyDown(42) || Keyboard.isKeyDown(54));
                func_35309_a(slot, j1, k, flag1);
            }
        }
    }

    private boolean getIsMouseOverSlot(Slot slot, int i, int j)
    {
        int k = (width - xSize) / 2;
        int l = (height - ySize) / 2;
        i -= k;
        j -= l;
        return i >= slot.xDisplayPosition - 1 && i < slot.xDisplayPosition + 16 + 1 && j >= slot.yDisplayPosition - 1 && j < slot.yDisplayPosition + 16 + 1;
    }

    protected void func_35309_a(Slot slot, int i, int j, boolean flag)
    {
    if(slot != null)
        {
            i = slot.slotNumber;
    if ( mc.thePlayer.gold >= slot.getStack().getItemPrice())
    {
    mc.thePlayer.inventory.addItemStackToInventory(slot.getStack());
    mc.thePlayer.gain_gold(-slot.getStack().getItemPrice());
        inventorySlots = original_container;
    }
        }

    }

    protected void mouseMovedOrUp(int i, int j, int k)
    {
        if(k != 0);
    }

    protected void keyTyped(char c, int i)
    {
        if(i == 1 || i == mc.gameSettings.keyBindInventory.keyCode)
        {
            mc.thePlayer.closeScreen();
        }
    }

    public void onGuiClosed()
    {
        if(mc.thePlayer == null)
        {
            return;
        } else
        {
            inventorySlots.onCraftGuiClosed(mc.thePlayer);
            //mc.playerController.func_20086_a(inventorySlots.windowId, mc.thePlayer);
            return;
        }
    }

    public boolean doesGuiPauseGame()
    {
        return false;
    }

    public void updateScreen()
    {
        super.updateScreen();
        if(!mc.thePlayer.isEntityAlive() || mc.thePlayer.isDead)
        {
            mc.thePlayer.closeScreen();
        }
    }

    protected static RenderItem itemRenderer = new RenderItem();
    protected int xSize;
    protected int ySize;
    public Container inventorySlots;
    public Container original_container;

}

Mais deux problème se posent :
- Si je clic à côté d'un objet le jeu crash :
Mods loaded: 2
ModLoader Beta 1.8.1
net.minecraft.src.mod_Mack 1.5_01

Minecraft has crashed!
----------------------

Minecraft has stopped running because it encountered a problem.

If you wish to report this, please copy this entire text and email it to [email protected].
Please include a description of what you did when the error occured.

--- BEGIN ERROR REPORT 2e3a52d4 --------
Generated 24/09/11 18:19

Minecraft: Minecraft Beta 1.8.1
OS: Windows 7 (amd64) version 6.1
Java: 1.6.0_25, Sun Microsystems Inc.
VM: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Sun Microsystems Inc.
LWJGL: 2.4.2
OpenGL: Intel(R) HD Graphics version 2.1.0 - Build 8.15.10.2104, Intel

java.lang.NullPointerException
at net.minecraft.src.GuiSeller.func_35309_a(GuiSeller.java:204)
at net.minecraft.src.GuiSeller.mouseClicked(GuiSeller.java:185)
at net.minecraft.src.GuiScreen.handleMouseInput(GuiScreen.java:120)
at net.minecraft.src.GuiScreen.handleInput(GuiScreen.java:110)
at net.minecraft.client.Minecraft.runTick(Minecraft.java:988)
at net.minecraft.client.Minecraft.run(Minecraft.java:483)
at java.lang.Thread.run(Thread.java:662)
--- END ERROR REPORT c8778af3 ----------

- Si je clic sur un objet celui si va bien dans mon inventaire, mais disparaît de l'inventaire du marchand ... Du coup, impossible d'en racheter, faut fermer rouvrir la fenêtre ...