Diverses Questions



  • Salut à tous! Je me poses plusieurs questions:

    1. Je souhaiterais stocker plusieurs valeurs propre a un bloc: il y peut y avoir plusieurs fois le même bloc, mais à chaque fois des valeurs différentes dans les différents blocs. Je dois passer par des NBTTag non ?
    2. J'ai déjà vu des permissions dans un mod (Custom Npc), mais je n'ai pas trouver comment faire, pouvez-vous m'aider/aiguiller?
    3. Comment faire que lorsque dans le GUI d'un bloc on clique sur un bouton, ça affiche une image dans le GUI et change la texture du bloc ?

    Merci de votre (futur) aider! J’espère trouver réponses à mes questions! 🙂


  • Administrateurs

    1. oui, donc pas une entité de bloc (TileEntity)
    2. Les perm des commandes sont générés automatique. Après il me semble qu'il y a une fonction canExecute("permission") dans la classe du joueur, à vérifier.
    3. Déjà il faudrait sauvegarder la texture actuel (donc TileEntity). Comme le joueur changera la texture via le gui, il faudra passer par un paquet.



    1. Ok merci, c'est un bloc avec rendu TESR, donc j'ai déjà une Tile Entity, mais je ne suis pas très alaise avec les NBTTag, savez-vous où je peux trouver un tutoriel même en anglais ?
    2. Euh, mais ce ne serait pas pour une commande: je voudrais faire un GUI qui lorsque plusieurs conditions requises sont "là", ça check si le joueur à la permission de faire l'action en plus des conditions précédentes (items et valeur d'un NBTTag).
    3. Je fais que quand le bouton est cliqué, le chemin d'acces de la texture change ?

  • Administrateurs

    1. http://www.minecraftforgefrance.fr/showthread.php?tid=1113
    2. Dans ce cas faut voir du côté du joueur si il n'y a pas une fonction pour check une perm
    3. à toi de voir, c'est en fonction de ce que tu veux faire.



  • 3. Mon bloc est un chaudron, je voudrais faire quand on mets dans le GUI un sceau, il se vide (je sais faire, juste je dois trouver l'event quand un slot change de contenu) et que le NBTTag "contenu" par exemple prenne la valeur "eauchaude" et que de l'eau apparaisse dans le chaudron.. Et éventuellement faire changer la couleur du liquide quand on fait une potion.


  • Administrateurs

    Dans le code au niveau du TESR la seule chose que tu as c'est le tile entity. Donc tu devra adapter la texture en fonction des valeurs du tile entity.
    Donc au niveau de ton gui, la seule chose que tu aura à faire c'est changer les variables du tile entity, et ensuite sur le TESR en fonction de ces variables tu change la texture.



  • J'ai suivis le tuto sur les NBTTag, je veux maintenant faire que la texture change en fonction de la valeur du Tag j'ai mis ca dans TileEntitySpecialRenderer:

    
    private void renderTileEntityChaudronAt(TileEntityChaudron tile, double x, double y, double z, float partialRenderTick)
    
        {
            GL11.glPushMatrix();
            GL11.glTranslated(x + 0.5D, y + 1.5D, z + 0.5D);
            GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F);
            GL11.glRotatef((90F * tile.getDirection()) + 180F, 0.0F, 1.0F, 0.0F);
            switch(tile.getContenu())
            {
              case "vide":
                this.texture = new ResourceLocation(ModHarryPotter.MODID, 
                "textures/models/blocks/model_block_chaudron.png");
                break;        
              default:
             this.texture = new ResourceLocation(ModHarryPotter.MODID, 
                  "textures/models/blocks/model_block_chaudron.png");;             
            }
            this.bindTexture(texture);
            model.renderAll();
            GL11.glPopMatrix();
        }
    

    Mais j'ai cette erreur:

    Cannot switch on a value of type String for source level below 1.7. Only convertible int values or enum variables are permitted.

    Voial comment j'ai fait pour le NBTTag:

    
    private byte direction;
    
        private ItemStack[] inventory = new ItemStack[72];
    private String name;
    private String contenu;
    
        @Override
        public void readFromNBT(NBTTagCompound nbttag)
        {
        super.readFromNBT(nbttag);
            this.direction = nbttag.getByte("Direction");
            this.contenu = nbttag.getString("vide");
            NBTTagList nbttaglist = nbttag.getTagList("Items", blockMetadata);
            this.inventory = new ItemStack[this.getSizeInventory()];
    
            if (nbttag.hasKey("Name"))
            {
                this.name = nbttag.getString("Name");
            }
    
            for (int i = 0; i < nbttaglist.tagCount(); i++)
            {
                NBTTagCompound nbttagcompound1 = (NBTTagCompound)nbttaglist.getCompoundTagAt(i);
                int j = nbttagcompound1.getByte("Slot");
    
                if (j >= 0 && j < this.inventory.length)
                {
                    this.inventory[j] = ItemStack.loadItemStackFromNBT(nbttagcompound1);
                }
            }
        }
    
        public void writeToNBT(NBTTagCompound nbttag)
        {
        super.writeToNBT(nbttag);
            nbttag.setByte("Direction", this.direction);
            nbttag.setString("vide", this.contenu);
    
            NBTTagList nbttaglist = new NBTTagList();
    
            for (int i = 0; i < this.inventory.length; i++)
            {
                if (this.inventory* != null)
                {
                    NBTTagCompound nbttagcompound1 = new NBTTagCompound();
                    nbttagcompound1.setByte("Slot", (byte)i);
                    this.inventory*.writeToNBT(nbttagcompound1);
                    nbttaglist.appendTag(nbttagcompound1);
                }
            }
    
            nbttag.setTag("Items", nbttaglist);
    
            if (this.hasCustomInventoryName())
            {
                nbttag.setString("Name", this.name);
            }
        }
    
        public byte getDirection()
        {
            return direction;
        }
    
        public String getContenu()
        {
            return contenu;
        }
    


  • @'sosoh':

    J'ai suivis le tuto sur les NBTTag, je veux maintenant faire que la texture change en fonction de la valeur du Tag j'ai mis ca dans TileEntitySpecialRenderer:

    
    private void renderTileEntityChaudronAt(TileEntityChaudron tile, double x, double y, double z, float partialRenderTick)
    
        {
            GL11.glPushMatrix();
            GL11.glTranslated(x + 0.5D, y + 1.5D, z + 0.5D);
            GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F);
            GL11.glRotatef((90F * tile.getDirection()) + 180F, 0.0F, 1.0F, 0.0F);
            switch(tile.getContenu())
            {
              case "vide":
                this.texture = new ResourceLocation(ModHarryPotter.MODID, 
                "textures/models/blocks/model_block_chaudron.png");
                break;        
              default:
             this.texture = new ResourceLocation(ModHarryPotter.MODID, 
                  "textures/models/blocks/model_block_chaudron.png");;             
            }
            this.bindTexture(texture);
            model.renderAll();
            GL11.glPopMatrix();
        }
    

    Mais j'ai cette erreur:

    Cannot switch on a value of type String for source level below 1.7. Only convertible int values or enum variables are permitted.

    Voial comment j'ai fait pour le NBTTag:

    
    private byte direction;
    
        private ItemStack[] inventory = new ItemStack[72];
    private String name;
    private String contenu;
    
        @Override
        public void readFromNBT(NBTTagCompound nbttag)
        {
        super.readFromNBT(nbttag);
            this.direction = nbttag.getByte("Direction");
            this.contenu = nbttag.getString("vide");
            NBTTagList nbttaglist = nbttag.getTagList("Items", blockMetadata);
            this.inventory = new ItemStack[this.getSizeInventory()];
    
            if (nbttag.hasKey("Name"))
            {
                this.name = nbttag.getString("Name");
            }
    
            for (int i = 0; i < nbttaglist.tagCount(); i++)
            {
                NBTTagCompound nbttagcompound1 = (NBTTagCompound)nbttaglist.getCompoundTagAt(i);
                int j = nbttagcompound1.getByte("Slot");
    
                if (j >= 0 && j < this.inventory.length)
                {
                    this.inventory[j] = ItemStack.loadItemStackFromNBT(nbttagcompound1);
                }
            }
        }
    
        public void writeToNBT(NBTTagCompound nbttag)
        {
        super.writeToNBT(nbttag);
            nbttag.setByte("Direction", this.direction);
            nbttag.setString("vide", this.contenu);
            
            NBTTagList nbttaglist = new NBTTagList();
    
            for (int i = 0; i < this.inventory.length; i++)
            {
                if (this.inventory* != null)
                {
                    NBTTagCompound nbttagcompound1 = new NBTTagCompound();
                    nbttagcompound1.setByte("Slot", (byte)i);
                    this.inventory*.writeToNBT(nbttagcompound1);
                    nbttaglist.appendTag(nbttagcompound1);
                }
            }
    
            nbttag.setTag("Items", nbttaglist);
    
            if (this.hasCustomInventoryName())
            {
                nbttag.setString("Name", this.name);
            }
        }
        
        public byte getDirection()
        {
            return direction;
        }
        
        public String getContenu()
        {
            return contenu;
        }
    

    L'erreur vient du switch car tu ne peux pas utiliser switch avec les String, tu dois juste le remplacer par :

    
    if (tile.getContenu().equalsIgnoreCase("vide") {
        this.texture = new ResourceLocation(ModHarryPotter.MODID, "textures/models/blocks/model_block_chaudron.png");
    } else {
        this.texture = new ResourceLocation(ModHarryPotter.MODID, "textures/models/blocks/model_block_chaudron.png");
    }
    
    

    Question : pourquoi ce sont les mêmes textures ?



  • Ok merci, le code va marcher comme ca ? Et ce sont les memes car par defaut c'est elle, et apres j'ai prevu de faire plusieur état donc il me faut que prenne en compte le cas "vide".

    Edit: ca ne marche pas:

    [02:16:02] [Client thread/INFO] [STDOUT]: [net.minecraft.client.Minecraft:displayCrashReport:388]: –-- Minecraft Crash Report ----

    // I bet Cylons wouldn't have this problem.

    Time: 18/02/15 02:16
    Description: Registering texture

    java.lang.NullPointerException: Registering texture
    at net.minecraft.client.resources.SimpleReloadableResourceManager.getResource(SimpleReloadableResourceManager.java:63)
    at net.minecraft.client.renderer.texture.SimpleTexture.loadTexture(SimpleTexture.java:35)
    at net.minecraft.client.renderer.texture.TextureManager.loadTexture(TextureManager.java:89)
    at net.minecraft.client.renderer.texture.TextureManager.bindTexture(TextureManager.java:45)
    at com.harrypotter.sosoh.client.render.blocks.BlockChaudronTechneRender.renderInventoryBlock(BlockChaudronTechneRender.java:26)
    at cpw.mods.fml.client.registry.RenderingRegistry.renderInventoryBlock(RenderingRegistry.java:125)
    at net.minecraft.src.FMLRenderAccessLibrary.renderInventoryBlock(FMLRenderAccessLibrary.java:59)
    at net.minecraft.client.renderer.RenderBlocks.renderBlockAsItem(RenderBlocks.java:8361)
    at net.minecraft.client.renderer.entity.RenderItem.doRender(RenderItem.java:147)
    at net.minecraft.client.renderer.entity.RenderItem.doRender(RenderItem.java:783)
    at net.minecraft.client.renderer.entity.RenderManager.func_147939_a(RenderManager.java:300)
    at net.minecraft.client.renderer.entity.RenderManager.renderEntityWithPosYaw(RenderManager.java:283)
    at net.minecraft.client.renderer.tileentity.RenderItemFrame.func_82402_b(RenderItemFrame.java:249)
    at net.minecraft.client.renderer.tileentity.RenderItemFrame.doRender(RenderItemFrame.java:72)
    at net.minecraft.client.renderer.tileentity.RenderItemFrame.doRender(RenderItemFrame.java:337)
    at net.minecraft.client.renderer.entity.RenderManager.func_147939_a(RenderManager.java:300)
    at net.minecraft.client.renderer.entity.RenderManager.renderEntityStatic(RenderManager.java:278)
    at net.minecraft.client.renderer.entity.RenderManager.renderEntitySimple(RenderManager.java:251)
    at net.minecraft.client.renderer.RenderGlobal.renderEntities(RenderGlobal.java:527)
    at net.minecraft.client.renderer.EntityRenderer.renderWorld(EntityRenderer.java:1300)
    at net.minecraft.client.renderer.EntityRenderer.updateCameraAndRender(EntityRenderer.java:1091)
    at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1056)
    at net.minecraft.client.Minecraft.run(Minecraft.java:951)
    at net.minecraft.client.main.Main.main(Main.java:164)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at net.minecraft.launchwrapper.Launch.launch(Launch.java:135)
    at net.minecraft.launchwrapper.Launch.main(Launch.java:28)
    at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:78)
    at GradleStart.main(GradleStart.java:45)



  • @'sosoh':

    Ok merci, le code va marcher comme ca ? Et ce sont les memes car par defaut c'est elle, et apres j'ai prevu de faire plusieur état donc il me faut que prenne en compte le cas "vide".

    Edit: ca ne marche pas:

    [02:16:02] [Client thread/INFO] [STDOUT]: [net.minecraft.client.Minecraft:displayCrashReport:388]: –-- Minecraft Crash Report ----

    // I bet Cylons wouldn't have this problem.

    Time: 18/02/15 02:16
    Description: Registering texture

    java.lang.NullPointerException: Registering texture
    at net.minecraft.client.resources.SimpleReloadableResourceManager.getResource(SimpleReloadableResourceManager.java:63)
    at net.minecraft.client.renderer.texture.SimpleTexture.loadTexture(SimpleTexture.java:35)
    at net.minecraft.client.renderer.texture.TextureManager.loadTexture(TextureManager.java:89)
    at net.minecraft.client.renderer.texture.TextureManager.bindTexture(TextureManager.java:45)
    at com.harrypotter.sosoh.client.render.blocks.BlockChaudronTechneRender.renderInventoryBlock(BlockChaudronTechneRender.java:26)
    at cpw.mods.fml.client.registry.RenderingRegistry.renderInventoryBlock(RenderingRegistry.java:125)
    at net.minecraft.src.FMLRenderAccessLibrary.renderInventoryBlock(FMLRenderAccessLibrary.java:59)
    at net.minecraft.client.renderer.RenderBlocks.renderBlockAsItem(RenderBlocks.java:8361)
    at net.minecraft.client.renderer.entity.RenderItem.doRender(RenderItem.java:147)
    at net.minecraft.client.renderer.entity.RenderItem.doRender(RenderItem.java:783)
    at net.minecraft.client.renderer.entity.RenderManager.func_147939_a(RenderManager.java:300)
    at net.minecraft.client.renderer.entity.RenderManager.renderEntityWithPosYaw(RenderManager.java:283)
    at net.minecraft.client.renderer.tileentity.RenderItemFrame.func_82402_b(RenderItemFrame.java:249)
    at net.minecraft.client.renderer.tileentity.RenderItemFrame.doRender(RenderItemFrame.java:72)
    at net.minecraft.client.renderer.tileentity.RenderItemFrame.doRender(RenderItemFrame.java:337)
    at net.minecraft.client.renderer.entity.RenderManager.func_147939_a(RenderManager.java:300)
    at net.minecraft.client.renderer.entity.RenderManager.renderEntityStatic(RenderManager.java:278)
    at net.minecraft.client.renderer.entity.RenderManager.renderEntitySimple(RenderManager.java:251)
    at net.minecraft.client.renderer.RenderGlobal.renderEntities(RenderGlobal.java:527)
    at net.minecraft.client.renderer.EntityRenderer.renderWorld(EntityRenderer.java:1300)
    at net.minecraft.client.renderer.EntityRenderer.updateCameraAndRender(EntityRenderer.java:1091)
    at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1056)
    at net.minecraft.client.Minecraft.run(Minecraft.java:951)
    at net.minecraft.client.main.Main.main(Main.java:164)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at net.minecraft.launchwrapper.Launch.launch(Launch.java:135)
    at net.minecraft.launchwrapper.Launch.main(Launch.java:28)
    at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:78)
    at GradleStart.main(GradleStart.java:45)

    Le problème est que tu devrais bind la texture dans une autre fonction comme la fonction onNeighborBlockChange et en mettre par défaut dans le constructeur.



  • Ok, mais apres la texture va s'update ?



  • @'sosoh':

    Ok, mais apres la texture va s'update ?

    Soit elle sera update avec le render soit avec le onNeighborChange, donc je pense qu'il n'y a pas de soucis, mais à verifier.



  • En fait je penses que je vais faire autrement mais pour ça j'ai besoin de savoir comment détecter quand un slot change de contenu: Je veux faire que quand je mets un sceau d'eau dans un slot, le sceau remplit soit remplacer par un sceau vide et que le NBTTag contenu obtienne la valeur "eau" et dans ce cas la, la texture change.


  • Administrateurs

    Le problème que tu as est sur le rendu dans l'inventaire, lorsque le rendu dans l'inventaire est fait l'objet tile est null, il faut donc prévoir le coup. Ou alors séparer le rendu dans le monde et celui dans l'inventaire.

    Ce n'est pas du tout par la fonction onNeighborChange qu'il faut passer.



  • Tu peux m'aider ou pas ? Je t'avoues ne pas avoir tout saisis ^^


  • Administrateurs

    Envoie la classe de ton TESR en entier.



  • VOila:

    
    package com.harrypotter.sosoh.client.render.blocks;
    
    import org.lwjgl.opengl.GL11;
    
    import com.harrypotter.sosoh.client.model.blocks.ModelChaudron;
    import com.harrypotter.sosoh.common.ModHarryPotter;
    import com.harrypotter.sosoh.common.blocks.TileEntityChaudron;
    
    import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
    import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
    import net.minecraft.tileentity.TileEntity;
    import net.minecraft.util.ResourceLocation;
    
    public class TileEntityChaudronSpecialRenderer extends TileEntitySpecialRenderer {
    
    public static ModelChaudron model = new ModelChaudron();
        public static ResourceLocation texture = new ResourceLocation(ModHarryPotter.MODID, "textures/models/blocks/model_block_chaudron.png");;
    
        public TileEntityChaudronSpecialRenderer()
        {
            this.func_147497_a(TileEntityRendererDispatcher.instance);
        }
    
        @Override
        public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float partialRenderTick)
        {
            this.renderTileEntityChaudronAt((TileEntityChaudron)tile, x, y, z, partialRenderTick);
        }
    
        private void renderTileEntityChaudronAt(TileEntityChaudron tile, double x, double y, double z, float partialRenderTick)
        {
            GL11.glPushMatrix();
            GL11.glTranslated(x + 0.5D, y + 1.5D, z + 0.5D);
            GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F);
            GL11.glRotatef((90F * tile.getDirection()) + 180F, 0.0F, 1.0F, 0.0F);
            this.bindTexture(texture);
            model.renderAll();
            GL11.glPopMatrix();
        }
    }
    
    

    et

    
    package com.harrypotter.sosoh.client.render.blocks;
    
    import net.minecraft.block.Block;
    import net.minecraft.client.Minecraft;
    import net.minecraft.client.renderer.RenderBlocks;
    import net.minecraft.world.IBlockAccess;
    
    import org.lwjgl.opengl.GL11;
    
    import com.harrypotter.sosoh.common.ModHarryPotter;
    import com.harrypotter.sosoh.proxy.ClientProxy;
    
    import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
    
    public class BlockChaudronTechneRender implements ISimpleBlockRenderingHandler {
    
        @Override
        public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer)
        {
            if(block == ModHarryPotter.blockChaudron && metadata == 0)
            {
                GL11.glPushMatrix();
                GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F);
                GL11.glTranslatef(0.0F, -1.0F, 0.0F);
                GL11.glRotatef(180F, 0.0F, 1.0F, 0.0F);
                Minecraft.getMinecraft().getTextureManager().bindTexture(TileEntityChaudronSpecialRenderer.texture);
                TileEntityChaudronSpecialRenderer.model.renderAll();
                GL11.glPopMatrix();
            }
        }
    
        @Override
        public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer)
        {
            return false;
        }
    
        @Override
        public boolean shouldRender3DInInventory(int modelId)
        {
            return true;
        }
    
        @Override
        public int getRenderId()
        {
            return ClientProxy.blockChaudronRenderId;
        }
    }
    
    

  • Administrateurs

    Avec cette méthode tu ne devrait pas avoir de NPE avec le rendu dans l'inventaire, c'est étrange. Actuellement le rendu fonctionne où non ?



  • Oui il fonctionne


  • Administrateurs

    Et quand tu utilise l'autre code que tu as mit à la première page (lui :

    ​if (tile.getContenu().equalsIgnoreCase("vide") {
        this.texture = new ResourceLocation(ModHarryPotter.MODID, "textures/models/blocks/model_block_chaudron.png");
    } else {
        this.texture = new ResourceLocation(ModHarryPotter.MODID, "textures/models/blocks/model_block_chaudron.png");
    }
    
    

    ) ça crash ?
    Je trouve ça étrange, il n'y a pas de raison pour que cela crash pourtant …