1.8 Gui coté serveur



  • MAJ du problème :

    Grace au indication, j'ai réussis à avancer un peu.

    Voici ma dernier classe  en date permettant de modifier l'affichage.

    ​package fr.Jodge.jodgeLibrary.common;
    
    import java.awt.Color;
    
    import org.lwjgl.opengl.GL11;
    
    import fr.Jodge.jodgeLibrary.common.toolSet.JWeapons;
    import net.minecraft.client.Minecraft;
    import net.minecraft.client.gui.FontRenderer;
    import net.minecraft.client.gui.Gui;
    import net.minecraft.client.gui.ScaledResolution;
    import net.minecraft.client.gui.inventory.GuiContainer;
    import net.minecraft.client.renderer.GlStateManager;
    import net.minecraft.client.renderer.RenderHelper;
    import net.minecraft.client.renderer.Tessellator;
    import net.minecraft.client.renderer.WorldRenderer;
    import net.minecraft.client.renderer.entity.RenderItem;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.inventory.Container;
    import net.minecraft.inventory.ContainerPlayer;
    import net.minecraft.inventory.IInventory;
    import net.minecraft.inventory.Slot;
    import net.minecraft.item.Item;
    import net.minecraft.item.ItemStack;
    import net.minecraft.profiler.Profiler;
    import net.minecraft.util.EnumChatFormatting;
    import net.minecraft.util.ResourceLocation;
    import net.minecraftforge.client.event.RenderGameOverlayEvent;
    import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType;
    import net.minecraftforge.fml.common.eventhandler.EventPriority;
    import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
    import net.minecraftforge.fml.relauncher.Side;
    import net.minecraftforge.fml.relauncher.SideOnly;
    
    public class JScreen extends Gui
    {
    private static EntityPlayer player;
    private static Item item;
    
    private static int WIDTH = 16;
    private static int HEIGHT = 16;
    private static int NBSLOT = 9;
    
    private static Minecraft MC = Minecraft.getMinecraft();;
    
        ResourceLocation TIMERTEXTURE = new ResourceLocation(Main.MODID + ":textures/gui/timerCombo.png");
    
    @SubscribeEvent(priority = EventPriority.NORMAL)
    public void onRenderHotbar(RenderGameOverlayEvent.Post event) 
    {
       if(event.isCancelable() || event.type != ElementType.HOTBAR) // to active whit hotbar
       {      
        return;
       }
    
       // VARIABLE    
    if(player == null || player != MC.thePlayer) // first time, and when player change cause of other mod ?
    {
    player = MC.thePlayer; // To get Player
    }
    
    int limMax = player.openContainer.getInventory().size();
    
    for (int i = limMax - NBSLOT; i < limMax; ++i)
    {
    Slot slot = (Slot)player.openContainer.inventorySlots.get(i);
       ItemStack itemStack = slot.getStack(); 
    
    if(itemStack != null)
    {
    item = itemStack.getItem();
    
        ScaledResolution sr = new ScaledResolution(MC, MC.displayWidth, MC.displayHeight);;
    
           int y = sr.getScaledHeight() - HEIGHT - 3;
           int x = 0;
    
    // FUNCTION
    
           if(item instanceof JWeapons)
           {
    
        // ################################################
        GlStateManager.pushMatrix(); 
           //GlStateManager.disableLighting();
           //GlStateManager.disableDepth();
           //GlStateManager.disableTexture2D();
           //GlStateManager.disableAlpha();
           //GlStateManager.disableBlend();
           GL11.glColor4f(0.8F, 0.8F, 0.8F, 1.0F); // Cyan, Magenta, Jaune, 
        // ################################################
    
           x = getXforSlot(i, limMax);
           if(x != 0)
           {
               double actualTimer = ((JWeapons)item).actualTimer;
               double comboTimer = ((JWeapons)item).comboTimer * 20;
            double width = (((comboTimer - Math.min(comboTimer, actualTimer)) * WIDTH) / comboTimer);
            if(actualTimer != 0)
            {
           Minecraft.getMinecraft().renderEngine.bindTexture(TIMERTEXTURE);
           JFunction.drawTexturedModalRect(x, y, 1.0F, 0, 0, (int)width, HEIGHT);
            }
           }
    
        // ################################################
           //GlStateManager.enableBlend();
           //GlStateManager.enableAlpha();
           //GlStateManager.enableTexture2D();
           //GlStateManager.enableDepth();
           //GlStateManager.enableLighting();
           GlStateManager.popMatrix();
        // ################################################
    
           } // end of item instanceof JWeapons
    
    }// end of itemStack != null
    
    }// end of for
    
    } // RenderGameOverlayEvent(post)
    
    int getXforSlot(int slot, int nbSlot)
    {
        ScaledResolution sr = new ScaledResolution(MC, MC.displayWidth, MC.displayHeight);;
    int x = (sr.getScaledWidth() / 2) - WIDTH/2;
    int pos = nbSlot - slot;
    
    if (pos > 0 && pos <= NBSLOT)
    {
    return x - (WIDTH + 4) * (pos - 5);
    }
    else
    {
    return 0;
    }
    }
    
    }
    
    /* for (int i = limMin; i < limMax; ++i)
    {
    Slot slot = (Slot)inventoryPlayer.inventorySlots.get(i);
        ItemStack itemstack = slot.getStack(); 
    itemRender = mc.getRenderItem();
    
        if(itemstack != null)
        {
            Item item = itemstack.getItem();
            Minecraft mc = Minecraft.getMinecraft();
            if(item instanceof JWeapons)
            {
    
                double actualTimer = ((JWeapons)item).actualTimer;
                double comboTimer = ((JWeapons)item).comboTimer * 20;
    
                Minecraft.getMinecraft().renderEngine.bindTexture(timerTexture);
                JFunction.drawTexturedModalRect(x, y, itemRender.zLevel + 1.0F, 0, 0, 16, 16);
    
            } // end of item instanceof JWeapons
        } // end of itemStack != null
    } // end of for*/
    
    

    Elle est initialisé grâce à a cette fonction, situer dans Init (a la racine du mod, blablabla)

    if(event.getSide().isClient())
    {
    MinecraftForge.EVENT_BUS.register(new JScreen());
    }
    

    Pour l'affichage, et sur les conseils de Scarex, j'ai ré-écris ma fonction "drawTextureModalRect" comme ceci : (en gros c'est la même a part que j'ai rajouter l'argument Z, et virer tous les casts)

    public static void drawTextureModalRect(int x, int y, float z, int textureX, int textureY, int width, int height)
    {
    drawTextureModalRect(x, y, z, textureX, textureY, width, height, 0.00390625F, 0.00390625F);
    }
    
    public static void drawTextureModalRect(int x, int y, float z, int textureX, int textureY, int width, int height, float f, float f1)
    {
    Tessellator tessellator = Tessellator.getInstance();
           WorldRenderer worldrenderer = tessellator.getWorldRenderer();
    
           worldrenderer.startDrawingQuads();
           worldrenderer.addVertexWithUV(x + 0, y + height, z, (textureX + 0) * f, (textureY + height) * f1);
           worldrenderer.addVertexWithUV(x + width, y + height, z, (textureX + width) * f, (textureY + height) * f1);
           worldrenderer.addVertexWithUV(x + width, y + 0, z, (textureX + width) * f, (textureY + 0) * f1);
           worldrenderer.addVertexWithUV(x + 0, y + 0, z, (textureX + 0) * f, (textureY + 0) * f1);
    tessellator.draw();
    }
    

    J'ai donc 3 problèmes qui apparaissent (outre le fait que ce n'est pas totalement finis) :
    - La textures n'es pas situer au bon endroit (elle est sensé se trouvais, a l'heure actuel, sous la hotbar, au niveau de l'objet, car j'utilise la fonction "xDisplayPosition" et "yDisplayPosition" pour obtenir les coordonné Yolo pour les placé, mais ca marche avec e
    - La texture ne s'affiche pas (cela a avoir sans doute avec toute les fonctions "GlStateManager", que je ne comprend pas (quelqu'un pourrai m’expliquer rapidement a quoi chacune sert ?) La texture soit avoir le nom  : (modID + ":textures/gui/img.ext")
    - La textures de la nourriture s'en retrouve buguer (peu être parceque j'utilise le buffer de minecraft avec "Minecraft.getMinecraft().renderEngine.bindTexture(timerTexture);"). C'est ma nouvelle texture qui apparaît alors (problème aussi présent dans l'équipement, et la respiration, mais pas dans la vie) Entourée les fonction interagissant sur le visuel avec notamment les images par "GlStateManager.pushMatrix();" et "GlStateManager.popMatrix();".

    Screen du rendu à l'heure actuel :

    Mon dernier problème en date concerne le coté serveur. En effet, je n'arrive pas a faire fonctionner l'affichage si je joue sur un serveur. J'ai tenter quelque bidouille avec @SideOnly(side.CLIENT), mais rien n'y fait, l'interface ne semble pas fonctionner…

    J'ai aussi un problème sur les variables de ma classe JWeapons (a laquelle je fais appelle pour calculer la taille de la texture). Les 2 variables sont initialisé avec "public int", mais sont commune a toute les JWeapons. Si une variable est modifier sur une des JWeapons, elle l'es sur toute les autres. Il n'y a pas moyen de la rendre unique a l'objet ? (si vous me sortez les NBTag je saute par la fenêtre, j'y pige qu'eud 😵 )



  • Si tu veux afficher quelque chose sur un GUI, il faut utiliser le DrawScreenEvent, en revanche dans ton cas, le RenderGameOverlayEvent est plus approprié. Pour afficher des images, il faudra appeler une méthode de la classe GUI appelée drawTextureModalRect (je te conseille de la recopier en plus propre car Minecrat l'a codé avec les pieds cette fonction).



  • Grace a ton indication, j'ai pus commencer a bidouillé, et j'arrive a obtenir la liste des slots (ainsi que leur coordonner x & y) sur lesquelles il y a un objet.

    Mais voila, pour le moment, ma méthode pour obtenir les slot passes par l'inventaire de l'entité joueur, depuis une fonction que j'ai temporairement mis dans mon "onUpdate" de ma classe JWeapons (ce qui est de loin la méthode la plus foireuse au monde vue qu'elle est appeler plusieurs fois en fonction du nombre d'objet ^^'

    Est il donc possible d'obtenir le joueur actuel directement depuis ma fonction d'affichage (donc uniquement quand nécessaire) ?
    (Note tous de même que ma fonction n'est activé QUE coter client, il n'y a donc qu'un joueur en théorie)

    Et aussi, est il possible de savoir quand l'inventaire est ouvert ou non ? (afin de n'afficher QUE les slots d'inventaires sur l'HUD)



  • Pour avoir le joueur côté client, c'est Minecraft.getMinecraft().thePlayer. Pour savoir si l'inventaire du joueur est ouvert, il faut faire :

    if (player.openContainer != null && player.openContainer instanceof ContainerPlayer)
    


  • Il semblerai que ta condition ne fonctionne pas tous a fait. Elle permet de savoir si le joueurs à ouvert un coffre ou non, mais pas de savoir si un joueur a ouvert son inventaire personnel.

    Le résultat est toujours true pour instanceof, puisque par défaut, lorsque aucun autre inventaire n'est ouvert, c'est celui du joueurs qui est chargé intégralement dans la variable openContainer.

    Ce que j'ai besoin dans mon cas, c'est que quand le joueur n'as aucun inventaire d'ouvert, les slots sur lesquelles il faut agir sont situer entre 36 et 44 (ceux de la hotbar). Quand l'inventaire est ouvert (touche E appuyer donc) il faut agir sur intégralité des slots.



  • Il semblerai que ta condition ne fonctionne pas tous a fait. Elle permet de savoir si le joueurs à ouvert un coffre ou non, mais pas de savoir si un joueur a ouvert son inventaire personnel.

    Le résultat est toujours true pour instanceof, puisque par défaut, lorsque aucun autre inventaire n'est ouvert, c'est celui du joueurs qui est chargé intégralement dans la variable openContainer.

    Ce que j'ai besoin dans mon cas, c'est que quand le joueur n'as aucun inventaire d'ouvert, les slots sur lesquelles il faut agir sont situer entre 36 et 44 (ceux de la hotbar). Quand l'inventaire est ouvert (touche E appuyer donc) il faut agir sur intégralité des slots.

    EDIT : J'ai aussi modifier le premier post, puisque je suis toujours sur le même problème, mais a un stade plus avancé. ^^


  • Moddeurs confirmés

    @'SCAREX':

    Pour avoir le joueur côté client, c'est Minecraft.getMinecraft().thePlayer. Pour savoir si l'inventaire du joueur est ouvert, il faut faire :

    if (player.openContainer != null && player.openContainer instanceof ContainerPlayer)
    

    Le player.openContainer != null est inutile, null instanceof class retourne toujours faux



  • Cela ne résous pas le problème… Ça optimise certes son code, mais mon problème initial est tous autre : Dans un soucis d'optimisation, je souhaite de pas scanner les slots non visible de l'inventaire du joueur, or ces dis slot sont constamment chargé dans openContainer.

    Le deuxième problème concernant l'affichage des textures au mauvaise coordonner (malgré un code qui semble correcte) et la texture de la nourriture/respiration/armure qui s'en retrouve buguer reste tous de même le problème prioritaire. J'ai correctement suivit toute les sources que j'ai trouver, et sur le plan théorique, cela devrai marché. Mais pas dans la pratique 😞


  • Moddeurs confirmés Rédacteurs Administrateurs

    Pour la texture de la nourriture/respiration/armure qui se retrouver buguer il faudrait que tu ouvres une nouvelle matrix
    ( GlStateManager.pushMatrix(); au début du rendu, GlStateManager.popMatrix(); à la fin du rendu)
    Pour les coordonnées utilisés ceux du slot n'est pas une bonne idée, ces coordonnées doivent être utilisé avec le container et le gui qui va avec. Il faudrait plutôt le centrer en fonction de event.resolution.
    Pour le reste je ne sais pas.



  • J'ai un peu galérer a placer ces deux commande, puisque apparemment, ou que je les mette, il n'apprécié pas que je fasse appelle à des fonctions différente. Du coup j'ai simplement tous remis dans une grosse fonction au final, puisque de toute façon sa ne me servira pas plusieurs fois.

    Pour les coordonnés, je souhaitai utilisé les coordonner des slots pour justement faire un algorithme générique quelque soit la position de l'objet (je pensais notamment en cas d'utilisation avec un mod telle que BattleGear, ou des mod déplacent la hotbar. Ou même l'utilisation de coffre plus grand que vanilla).

    Est ce que tu ne connaîtrai pas une autre alternative que passé par un pourcentage de taille d'écran pour que justement l'algo soit générique ?

    Thank's pour votre aide déjà précieuse ^^



  • Changement de problème, j'ai enfin réussis a centrer, en mode yolo avec des valeurs en pixel de partout, mais sa fonctionne lorsque je redimensionne alors bon 😵

    Mon dernier problème en date concerne le coté serveur.
    Si je met le mod sur un serveur, et que je m'y connecte, je n'arrive pas a faire fonctionner l'affichage. J'ai tenter quelque bidouille avec @SideOnly(side.CLIENT), mais rien n'y fait, l'interface ne semble pas fonctionner… (Le jeu ne plante pas pour autant, donc le serveur ne fait pas appel a ces fonction). J'ai comme dernier piste le fait que le client n’accède pas au variable coté serveur, auxquelles cas je ne sais pas comment l’empêcher

    J'ai aussi un problème sur les variables de ma classe JWeapons (à laquelle je fais appelle pour calculer la taille de la texture). Les 2 variables sont initialisé avec "public int", mais sont commune a toute les JWeapons. Si une variable est modifier sur une des JWeapons, elle l'es sur toute les autres. Il n'y a pas moyen de la rendre unique a l'objet ? (si vous me sortez les NBTag je saute par la fenêtre, j'y pige qu'eud 😵 )

    (au passage, à partir de combine de temps d'intervalle on peu considérer qu'il ne s'agit plus d'un double post ?)


  • Moddeurs confirmés Rédacteurs Administrateurs

    @'Jodge':

    J'ai comme dernier piste le fait que le client n’accède pas au variable coté serveur, auxquelles cas je ne sais pas comment l’empêcher

    C'est ça, et donc il faut passer par un ou des paquets.

    @'Jodge':

    J'ai aussi un problème sur les variables de ma classe JWeapons (à laquelle je fais appelle pour calculer la taille de la texture). Les 2 variables sont initialisé avec "public int", mais sont commune a toute les JWeapons. Si une variable est modifier sur une des JWeapons, elle l'es sur toute les autres. Il n'y a pas moyen de la rendre unique a l'objet ? (si vous me sortez les NBTag je saute par la fenêtre, j'y pige qu'eud 😵 )

    Dans ce cas tu peux sauter par la fenêtre, désolé x)



  • Alors, j'ai bien étudié tous les tuto que j'ai trouver sur internet, et ce forum

    
    ​    public static enum nbtVar
        {
        RightCombo("rC"),
        RightPreviousCombo("rPC"),
        LeftCombo("lC"),
        LeftPreviousCombo("lPC"),
        ActualCombo("aC");
    
        private String name = "";
    
        nbtVar(String name)
        {
        this.name = name;
        }
    
        public String toString()
        {
        return name;
        }
    
            public static boolean writeNbtVar(ItemStack stack, nbtVar var, int value)
            {
            boolean isWrite = false;
            if (stack.hasTagCompound())
            {
                    NBTTagCompound itemData = stack.getTagCompound();
    
                String varName = var.toString();
    
                if(itemData.hasKey(varName))
                {
                stack.getTagCompound().setInteger(varName, value); 
                   isWrite = true;
                }
            }
            return isWrite;
            }
    
            public static boolean incNbtVarInt(ItemStack stack, nbtVar var)
            {
            int i = readNbtVarInt(stack, var);
            return writeNbtVar(stack, var, i + 1);
            }
    
            public static boolean decNbtVarInt(ItemStack stack, nbtVar var)
            {
            int i = readNbtVarInt(stack, var);
            return writeNbtVar(stack, var, i - 1);
            }
    
            public static int readNbtVarInt(ItemStack stack, nbtVar var)
            {
            if (stack.hasTagCompound())
            {
                    NBTTagCompound itemData = stack.getTagCompound();
    
                if(var == nbtVar.RightCombo)
                {
                String varName = nbtVar.RightCombo.toString();
    
                if(itemData.hasKey(varName))
                {
                return stack.getTagCompound().getInteger(varName); 
                }
                }  
            }
            return 0;
        }
        }
    

    Je me suis fait cette mini classe pour m'assisté dans l'écriture des tags, puis j'ai modifié mes variables par ces fonctions.

    Pour "créer" mes variable j'ai mis dans le "onUptade" de ma classe JWeapons (extension de ItemSword) ceci :

    ​        if(stack.getTagCompound() == null)
            {
            stack.setTagCompound(new NBTTagCompound());
    
            stack.getTagCompound().setInteger("rC", 0); // Right Combo
            stack.getTagCompound().setInteger("rPC",-1); // Right Previous Combo
            stack.getTagCompound().setInteger("lC", 0); // Left Combo
            stack.getTagCompound().setInteger("lPC", -1); // Left Previous Combo
            stack.getTagCompound().setInteger("aT",0); // actualTimer
            }
    

    Malheureusement, il semblerai que j'ai commis une erreur quelque part, puisque je n'accède pas au valeur:'(

    Je ne sais pas si l'erreur viens de la, ou si elle viens de ma classe JScreen :

    
    […]
    Slot slot = (Slot)player.openContainer.inventorySlots.get(i);
    ItemStack itemStack = slot.getStack();
    
    if(itemStack != null)
    {
    item = itemStack.getItem();
    […]
    int actualTimer = nbtVar.readNbtVarInt(itemStack, nbtVar.ActualCombo);
    […]
    }
    […]
    
    

  • Moddeurs confirmés Rédacteurs Administrateurs

    Ajoutes des System.out.println( ) pour déboguer ton code.



  • Forcé de constaté que parfois, (souvent dans mon cas) l'erreur est tellement grosse qu'elle me saute au yeux… 
    J'ai initialisé mon tag au nom de "aT" dans JWeapons, et "aC" dans mon énum ^^'
    J'ai donc revue ma fonction d'initialisation pour qu'elle prène le nom définis dans mon énum pour éviter les problèmes de ce genre.

    J'ai aussi vue qu'il manquais dans ma fonction onUptade la condition "if(!worldIn.isRemote)" pour éviter d'agir a la fois coté client et serveur.

    De plus, chose que je n'avais pas capté sur le coup, ma fonction d'initialisation ne réinitialise pas mes précédent tag, du coup les tests effectuer depuis mon ancien objet générer bugguer forcément.

    En revanche, mon bug est bien réel.

    Voici un extrait du log :
    (lecture deux ligne par deux ligne sous la forme suivante :
    #1# : nom du tag, valeur initial, valeur recu
    ### nom du tag, nouvelle valeur, modification effectuer
    Si la nouvelle valeur n'es pas celle égale a reçu, alors le boolean devrai être à false, ce qui signifie que le tag n’existe pas)

    :::
    [21:30:18] [Server thread/INFO] [STDOUT]: [fr.Jodge.jodgeLibrary.common.JFunction:write:1091]: ###
    [21:30:18] [Server thread/INFO] [STDOUT]: [fr.Jodge.jodgeLibrary.common.JFunction:write:1091]: #1# : rC 0 1
    [21:30:18] [Server thread/INFO] [STDOUT]: [fr.Jodge.jodgeLibrary.common.JFunction:write:1091]: ### : rC 1 true
    [21:30:18] [Server thread/INFO] [STDOUT]: [fr.Jodge.jodgeLibrary.common.JFunction:write:1091]: ###
    [21:30:18] [Server thread/INFO] [STDOUT]: [fr.Jodge.jodgeLibrary.common.JFunction:write:1091]: #1# : aT 0 1
    [21:30:18] [Server thread/INFO] [STDOUT]: [fr.Jodge.jodgeLibrary.common.JFunction:write:1091]: ### : aT 0 true
    [21:30:18] [Server thread/INFO] [STDOUT]: [fr.Jodge.jodgeLibrary.common.JFunction:write:1091]: #1# : aT 0 0
    [21:30:18] [Server thread/INFO] [STDOUT]: [fr.Jodge.jodgeLibrary.common.JFunction:write:1091]: ### : aT 0 true
    [21:30:18] [Server thread/INFO] [STDOUT]: [fr.Jodge.jodgeLibrary.common.JFunction:write:1091]: #1# : rPC 0 1
    [21:30:18] [Server thread/INFO] [STDOUT]: [fr.Jodge.jodgeLibrary.common.JFunction:write:1091]: ### : rPC 0 true
    [21:30:18] [Server thread/INFO] [STDOUT]: [fr.Jodge.jodgeLibrary.common.JFunction:write:1091]: #1# : aT 0 1
    [21:30:18] [Server thread/INFO] [STDOUT]: [fr.Jodge.jodgeLibrary.common.JFunction:write:1091]: ### : aT 0 true
    [21:30:18] [Server thread/INFO] [STDOUT]: [fr.Jodge.jodgeLibrary.common.JFunction:write:1091]: #1# : aT 0 0
    [21:30:18] [Server thread/INFO] [STDOUT]: [fr.Jodge.jodgeLibrary.common.JFunction:write:1091]: ### : aT 0 true
    [21:30:18] [Server thread/INFO] [STDOUT]: [fr.Jodge.jodgeLibrary.common.JFunction:write:1091]: #1# : rPC 0 1
    [21:30:18] [Server thread/INFO] [STDOUT]: [fr.Jodge.jodgeLibrary.common.JFunction:write:1091]: ### : rPC 0 true
    :::

    Les 4 premier lignes sont séparer des autres, pour cause, elle sont dans la fonction "onPlayerStoppedUsing".
    On peu voir ici que la modification a correctement lieu.

    Le premier problème a lieu au niveau de la ligne 6. Sur la ligne 5 on peu voir que la valeur reçus (le 3eme argument) est 1.
    Or la valeur n'est pas mis a jour (pour rapel, elle passe par la même fonction que la premier). Ces deux ligne corresponde a l'incrémentation de base de ma boucle.

    la 7 et 8 eme ligne sont la pour s'assurer que les valeur retourne a 0, car il y a eu une modification de right clic (les 4 premier ligne)

    la ligne 9 et 10 sont la pour justement empêcher que ma variable ne soit ré-initialisé a chaque tour de boucle (en revanche son incrémentation continue).

    nous avons donc 3 fonctions qui bug ici.
    Si nous regardons les fonctions de plus près, on se rend compte qu'elle ont lieu dans ce sens :
    Incrémentation (fonctionnelle)
    Incrémentation (buguer)
    Changement de valeur (buguer)
    Changement de valeur (buguer)

    Le boolean étant a true depuis que j'ai correctement renommé mon tag, il n'y a aucune raison pour que cela ne fonctionne pas 😞

    J'ai rien compris ces tag à la con, mais ça m'as l'air un poil buguer quand on y fait trop appelle ^^'X)


  • Moddeurs confirmés Rédacteurs Administrateurs

    Renvoies ton code actuel vu que tu as fait des modifications depuis.



  • Désoler pour la réponse un poil tardive, j'ai eu quelque problème IRL (vive les travaux d'urgence T-T).

    enfin bref, après avoir galérer avec GitHub en vain (allez savoir pourquoi le bouton importer un fichier/projet, qui est pourtant le plus basique de mon point de vue n'existe pas sur le site, ou alors est super bien planqué…)

    Du coup, comme ça m'as un peu gonfler, je vais me contenter des bonne vielle balise java pour le moment...

    Main (@mod) :

    package fr.Jodge.jodgeLibrary.common;
    
    import net.minecraftforge.common.MinecraftForge;
    import net.minecraftforge.fml.common.Mod;
    import net.minecraftforge.fml.common.Mod.EventHandler;
    import net.minecraftforge.fml.common.Mod.Instance;
    
    import net.minecraftforge.fml.common.SidedProxy;
    
    import net.minecraftforge.fml.common.event.FMLInitializationEvent;
    import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
    import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
    
    @Mod(modid=Main.MODID, name=Main.MODNAME, version=Main.MODVER) //Tell forge "Oh hey, there's a new mod here to load."
    public class Main
    {
       public static final String MODID = "jodgelibrary";
       public static final String MODNAME = "Jodge Library";
       public static final String MODVER = "A0.1.5";
    
       public static final boolean DEBUG = true;
    
    @Instance(MODID)
    public static Main instance;
    
    @SidedProxy(clientSide = "fr.Jodge.jodgeLibrary.client.ClientProxy", serverSide = "fr.Jodge.jodgeLibrary.common.CommonProxy")
    public static CommonProxy proxy;
    
    @EventHandler
    public void preInit(FMLPreInitializationEvent event)
    {
    
    }
    
    @EventHandler
    public void init(FMLInitializationEvent event)
    {
    proxy.registerRender();
    if(event.getSide().isClient())
    {
    MinecraftForge.EVENT_BUS.register(new JScreen());
    }
    }
    
    @EventHandler
    public void postInit(FMLPostInitializationEvent event)
    {
    
    }
    
    }
    
    

    JScreen :

    ​package fr.Jodge.jodgeLibrary.common;
    
    import java.awt.Color;
    
    import org.lwjgl.opengl.GL11;
    
    import fr.Jodge.jodgeLibrary.common.JFunction.nbtVar;
    import fr.Jodge.jodgeLibrary.common.toolSet.JWeapons;
    import net.minecraft.client.Minecraft;
    import net.minecraft.client.gui.FontRenderer;
    import net.minecraft.client.gui.Gui;
    import net.minecraft.client.gui.ScaledResolution;
    import net.minecraft.client.gui.inventory.GuiContainer;
    import net.minecraft.client.renderer.GlStateManager;
    import net.minecraft.client.renderer.RenderHelper;
    import net.minecraft.client.renderer.Tessellator;
    import net.minecraft.client.renderer.WorldRenderer;
    import net.minecraft.client.renderer.entity.RenderItem;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.inventory.Container;
    import net.minecraft.inventory.ContainerPlayer;
    import net.minecraft.inventory.IInventory;
    import net.minecraft.inventory.Slot;
    import net.minecraft.item.Item;
    import net.minecraft.item.ItemStack;
    import net.minecraft.profiler.Profiler;
    import net.minecraft.util.EnumChatFormatting;
    import net.minecraft.util.ResourceLocation;
    import net.minecraftforge.client.event.RenderGameOverlayEvent;
    import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType;
    import net.minecraftforge.fml.common.eventhandler.EventPriority;
    import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
    import net.minecraftforge.fml.relauncher.Side;
    import net.minecraftforge.fml.relauncher.SideOnly;
    
    public class JScreen extends Gui
    {
    private static EntityPlayer player;
    private static Item item;
    
    private static int WIDTH = 16;
    private static int HEIGHT = 16;
    private static int NBSLOT = 9;
    
    private static Minecraft MC = Minecraft.getMinecraft();;
    
        ResourceLocation TIMERTEXTURE = new ResourceLocation(Main.MODID + ":textures/gui/timerCombo.png");
    
        @SideOnly(Side.CLIENT)
    @SubscribeEvent(priority = EventPriority.NORMAL)
    public void onRenderHotbar(RenderGameOverlayEvent.Post event) 
    {
       if(event.isCancelable() || event.type != ElementType.HOTBAR) // to active whit hotbar
       {      
        return;
       }
    
       // VARIABLE    
    if(player == null || player != MC.thePlayer) // first time, and when player change cause of other mod ?
    {
    player = MC.thePlayer; // To get Player
    }
    
    int limMax = player.openContainer.getInventory().size();
    
    for (int i = limMax - NBSLOT; i < limMax; ++i)
    {
    Slot slot = (Slot)player.openContainer.inventorySlots.get(i);
       ItemStack itemStack = slot.getStack(); 
    
    if(itemStack != null)
    {
    item = itemStack.getItem();
    
        ScaledResolution sr = new ScaledResolution(MC, MC.displayWidth, MC.displayHeight);;
    
           int y = sr.getScaledHeight() - HEIGHT - 3;
           int x = 0;
    
    // FUNCTION
    
           if(item instanceof JWeapons)
           {
        // ################################################
        GlStateManager.pushMatrix(); 
           //GlStateManager.disableLighting();
           //GlStateManager.disableDepth();
           //GlStateManager.disableTexture2D();
           //GlStateManager.disableAlpha();
           //GlStateManager.disableBlend();
           GL11.glColor4f(0.8F, 0.8F, 0.8F, 1.0F); // Cyan, Magenta, Jaune, 
        // ################################################
    
           x = getXforSlot(i, limMax);
           if(x != 0)
           {
               int actualTimer = nbtVar.readNbtVarInt(itemStack, nbtVar.ActualCombo);
               int comboTimer = ((JWeapons)item).comboTimer * 20;
            double width = (((comboTimer - Math.min(comboTimer, actualTimer)) * WIDTH) / comboTimer);
    
               if(actualTimer != 0)
            {
           Minecraft.getMinecraft().renderEngine.bindTexture(TIMERTEXTURE);
           JFunction.drawTexturedModalRect(x, y, 1.0F, 0, 0, (int)width, HEIGHT);
            }
           }
    
        // ################################################
           //GlStateManager.enableBlend();
           //GlStateManager.enableAlpha();
           //GlStateManager.enableTexture2D();
           //GlStateManager.enableDepth();
           //GlStateManager.enableLighting();
           GlStateManager.popMatrix();
        // ################################################
    
           } // end of item instanceof JWeapons
    
    }// end of itemStack != null
    
    }// end of for
    
    } // RenderGameOverlayEvent(post)
    
    int getXforSlot(int slot, int nbSlot)
    {
        ScaledResolution sr = new ScaledResolution(MC, MC.displayWidth, MC.displayHeight);;
    int x = (sr.getScaledWidth() / 2) - WIDTH/2;
    int pos = nbSlot - slot;
    
    if (pos > 0 && pos <= NBSLOT)
    {
    return x - (WIDTH + 4) * (pos - 5);
    }
    else
    {
    return 0;
    }
    }
    
    }
    
    /* for (int i = limMin; i < limMax; ++i)
    {
    Slot slot = (Slot)inventoryPlayer.inventorySlots.get(i);
        ItemStack itemstack = slot.getStack(); 
    itemRender = mc.getRenderItem();
    
        if(itemstack != null)
        {
            Item item = itemstack.getItem();
            Minecraft mc = Minecraft.getMinecraft();
            if(item instanceof JWeapons)
            {
    
                double actualTimer = ((JWeapons)item).actualTimer;
                double comboTimer = ((JWeapons)item).comboTimer * 20;
    
                Minecraft.getMinecraft().renderEngine.bindTexture(timerTexture);
                JFunction.drawTexturedModalRect(x, y, itemRender.zLevel + 1.0F, 0, 0, 16, 16);
    
            } // end of item instanceof JWeapons
        } // end of itemStack != null
    } // end of for*/
    

    JFunction (j'ai enlever toute les fonction qui ne sont pas utiles pour alléger) :

    ​package fr.Jodge.jodgeLibrary.common;
    
    import java.util.Locale;
    
    import fr.Jodge.jodgeLibrary.common.toolSet.JWeapons;
    
    import net.minecraft.block.Block;
    import net.minecraft.block.BlockCrops;
    
    import net.minecraft.block.BlockBush;
    import net.minecraft.client.renderer.Tessellator;
    import net.minecraft.client.renderer.WorldRenderer;
    
    import net.minecraft.enchantment.EnchantmentHelper;
    
    import net.minecraft.entity.EntityLivingBase;
    import net.minecraft.entity.SharedMonsterAttributes;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.entity.player.EntityPlayerMP;
    
    import net.minecraft.init.Blocks;
    
    import net.minecraft.item.Item;
    import net.minecraft.item.ItemStack;
    
    import net.minecraft.nbt.NBTTagCompound;
    import net.minecraft.network.play.server.S12PacketEntityVelocity;
    
    import net.minecraft.stats.AchievementList;
    import net.minecraft.stats.StatList;
    
    import net.minecraft.util.BlockPos;
    import net.minecraft.util.DamageSource;
    import net.minecraft.util.MathHelper;
    
    import net.minecraft.world.World;
    
    import net.minecraftforge.fml.common.registry.GameRegistry;
    import net.minecraftforge.fml.relauncher.Side;
    import net.minecraftforge.fml.relauncher.SideOnly;
    
    public class JFunction 
    {
    […]
       public static enum nbtVar
       {
        RightCombo("rC"),
        RightPreviousCombo("rPC"),
        LeftCombo("lC"),
        LeftPreviousCombo("lPC"),
        ActualCombo("aT");
    
        private String name = "";
    
        nbtVar(String name)
        {
        this.name = name;
        }
    
        public String toString()
        {
        return name;
        }
    
           public static boolean writeNbtVar(ItemStack stack, nbtVar var, int value)
           {
            JFunction.write("#1# : " + var + " " + nbtVar.readNbtVarInt(stack, var) + " " + value);
    
            boolean isWrite = false;
            if (stack.hasTagCompound())
            {
                   NBTTagCompound itemData = stack.getTagCompound();
    
                String varName = var.toString();
    
                if(itemData.hasKey(varName))
                {
                stack.getTagCompound().setInteger(varName, value);
                   isWrite = true;
                }
            }
            JFunction.write("### : " + var + " " + nbtVar.readNbtVarInt(stack, var) + " " + isWrite);
    
            return isWrite;
    
           }
    
           public static boolean incNbtVarInt(ItemStack stack, nbtVar var)
           {
            int i = readNbtVarInt(stack, var);
    
            return writeNbtVar(stack, var, i + 1);
           }
    
           public static boolean decNbtVarInt(ItemStack stack, nbtVar var)
           {
            int i = readNbtVarInt(stack, var);
            return writeNbtVar(stack, var, i - 1);
           }
    
    public static int readNbtVarInt(ItemStack stack, nbtVar var)
    {
    if (stack.hasTagCompound())
    {
    NBTTagCompound itemData = stack.getTagCompound();
    
    String varName = var.toString();
    
    if (itemData.hasKey(varName))
    {
    return stack.getTagCompound().getInteger(varName);
    }
    }
    return 0;
    }
    
       }
    […]
       @SideOnly(Side.CLIENT)
    public static void drawTexturedModalRect(int x, int y, float z, int textureX, int textureY, int width, int height)
    {
    drawTexturedModalRect(x, y, z, textureX, textureY, width, height, 0.00390625F, 0.00390625F);
    }
    
       @SideOnly(Side.CLIENT)
    public static void drawTexturedModalRect(int x, int y, float z, int textureX, int textureY, int width, int height, float f, float f1)
    {
    Tessellator tessellator = Tessellator.getInstance();
           WorldRenderer worldrenderer = tessellator.getWorldRenderer();
    
           worldrenderer.startDrawingQuads();
           worldrenderer.addVertexWithUV(x + 0, y + height, z, (textureX + 0) * f, (textureY + height) * f1);
           worldrenderer.addVertexWithUV(x + width, y + height, z, (textureX + width) * f, (textureY + height) * f1);
           worldrenderer.addVertexWithUV(x + width, y + 0, z, (textureX + width) * f, (textureY + 0) * f1);
           worldrenderer.addVertexWithUV(x + 0, y + 0, z, (textureX + 0) * f, (textureY + 0) * f1);
    tessellator.draw();
    }
    […]
    public static void write (String text)
    {
    System.out.println(text);
    }
    

    Si il manque d'autre fichier, je peu les rajouter si besoin, j'essaye juste d'éviter de mettre tout les fichiers pour que ceux qui comme toi accepte de perdre un peu de leurs temps pour aider les autres n'en perde justement pas trop à s'y retrouver dans les fichiers 😵


  • Moddeurs confirmés Rédacteurs Administrateurs

    public static int readNbtVarInt(ItemStack stack, nbtVar var)
    {
    if (stack.hasTagCompound())
    {
    NBTTagCompound itemData = stack.getTagCompound();
    
    if(var == nbtVar.RightCombo)
    {
    String varName = nbtVar.RightCombo.toString();
    
    if(itemData.hasKey(varName))
    {
    return stack.getTagCompound().getInteger(varName);
    }
    }
    }
    return 0;
    }
    

    Pourquoi tu as une condition if(var == nbtVar.RightCombo) ici ?



  • Autant pour moi, ce n'est pas toute à fait la bonne version du code (grâce ou a cause de Github, j'ai du récupérer une ancienne sauvegarde du code, parce que j'avais accidentellement tous effacé)

    La bonne version de la fonction est :

    public static int readNbtVarInt(ItemStack stack, nbtVar var)
    {
    if (stack.hasTagCompound())
    {
    NBTTagCompound itemData = stack.getTagCompound();
    
    String varName = var.toString();
    
    if (itemData.hasKey(varName))
    {
    return stack.getTagCompound().getInteger(varName);
    }
    }
    return 0;
    }
    

    Truc plutôt étrange, mon problème d'écriture c'est réglé lorsque j'ai ré-écrit le code manquant a cause de Github. Je suppose que j'ai enlever l'erreur en ré-écrivant le code ^^' (note que l'erreur ne pouvais pas venir de read, car la fonction n'étais pas utilisé dans le write, sauf pour l'affichage. L'affichage étais donc peu être buguer, mais la valeur n'étais jamais atteinte, puisque l'objet n'étais jamais ré-initialisé, et que je n'utilisai pas encore les nouvelles fonction dans ma classe JScreen au moment du test)

    Du coup j'ai un problème qui persiste.
    Pour faire un timer, j'écrit tous les tic, dans un tag, et cela entraîne une ré-initialisation constante de l’objet (et donc de l'animation).
    il n'y a pas une manière différente de faire timer (moins gourmand en ressources, qui dure X tick pour chaque instance de l'objet, et qui se réinitialise dès que la condition change uniquement pour cette objet ?

    Voila ma classe a l'heure actuel :

    public void onUpdate(ItemStack stack, World worldIn, Entity entityIn, int itemSlot, boolean isSelected)
    {
    if(stack.getTagCompound() == null)
           {
            stack.setTagCompound(new NBTTagCompound());
    
            stack.getTagCompound().setInteger("rC", 0); // Right Combo
            stack.getTagCompound().setInteger("rPC",0); // Right Previous Combo
            stack.getTagCompound().setInteger("lC", 0); // Left Combo
            stack.getTagCompound().setInteger("lPC", 0); // Left Previous Combo
            stack.getTagCompound().setInteger("aT",0); // actualTimer
           }
    
    if ((nbtVar.readNbtVarInt(stack, nbtVar.RightCombo) != 0) || (nbtVar.readNbtVarInt(stack, nbtVar.LeftCombo) != 0))
    {
    nbtVar.incNbtVarInt(stack, nbtVar.ActualCombo);
    if (nbtVar.readNbtVarInt(stack, nbtVar.ActualCombo) >= this.comboTimer)
    {
    nbtVar.writeNbtVar(stack, nbtVar.RightCombo, 0);
    nbtVar.writeNbtVar(stack, nbtVar.LeftCombo, 0);
    nbtVar.writeNbtVar(stack, nbtVar.ActualCombo, 0);
    }
    else if ( nbtVar.readNbtVarInt(stack, nbtVar.RightCombo) != nbtVar.readNbtVarInt(stack, nbtVar.RightPreviousCombo) ||
    nbtVar.readNbtVarInt(stack, nbtVar.LeftCombo) != nbtVar.readNbtVarInt(stack, nbtVar.LeftPreviousCombo))
    {
    nbtVar.writeNbtVar(stack, nbtVar.ActualCombo, 0);
    }
    if (nbtVar.readNbtVarInt(stack, nbtVar.RightCombo) != nbtVar.readNbtVarInt(stack, nbtVar.RightPreviousCombo))
    {
    nbtVar.writeNbtVar(stack, nbtVar.RightPreviousCombo, nbtVar.readNbtVarInt(stack, nbtVar.RightCombo));
    }
    if (nbtVar.readNbtVarInt(stack, nbtVar.LeftCombo) != nbtVar.readNbtVarInt(stack, nbtVar.LeftPreviousCombo))
    {
    nbtVar.writeNbtVar(stack, nbtVar.LeftPreviousCombo, nbtVar.readNbtVarInt(stack, nbtVar.LeftCombo));
    }
    }
    }
    

  • Moddeurs confirmés Rédacteurs Administrateurs

    Tu l'utilises pour quoi ce timer ?


Log in to reply