Créer un item zoom


  • Administrateurs

    Salut à tous ! Vous avez été nombreux à me demander de faire ce tutoriel car il vous semble intéressant de faire un item qui fait un zoom/dé-zoom lors d'un clique droit. Et bien chose promise chose due ! 🙂

    --SOMMAIRE--

    1. Les pré-requis
    2. La classe principale
    3. Le Tick Handler
    4. La classe de l'Item
    5. Le rendu final des classes
    6. BONUS

    -ATTENTION-
    Ce tutoriel ne modifie en aucun cas le FOV de Minecraft !! Nous allons faire un vrai zoom !

    1. Les pré-requis

    Pour commencer, vous devez avoir des connaissances en java et savoir créer un item ainsi que maîtriser le TickHandler.

    2. La classe principale

    Dans la classe principale de notre Mod, nous allons y ajouter un boolean que nous allons appeler "zoom" juste au dessus de votre méthode de pré-initialisation :

    public static boolean zoom;
    

    Oui, le boolean doit être STATIC ! Sinon vous aurez une erreur ! (Pas toute de suite, mais lorsque nous en aurons besoin.)

    Oui mais pourquoi ne doit-on pas mettre = false ?
    -Car un boolean est automatiquement en false quand il n'y a pas d'égale.

    3. Le Tick Handler

    Eh oui, il fallait s'en douter, mais pour que le zoom soit fonctionnel, nous aurons besoin d'un TickHandler ! (Par pitié, ne ramenez pas la fonction "onUpdate" de la classe Item ! Le zoom ne fonctionne pas avec !)

    Pour les zoom, nous n'utiliserons pas un TickCommonHandler, mais plutôt un TickClientHandler ;). Le serveur n'a pas à gérer le zoom, mais le boolean ! 😄

    Donc faites une classe avec un nom quelconque du moment qu'elle implémente ITickHandler.

    Donc moi je vais l'appeler "TickClientHandler" comme ceci :

    public class TickClientHandler implements ITickHandler
    

    Ensuite vous allez devoir ajouter ces méthodes dans la classe :

    @Override
    public void tickStart(EnumSet<TickType> type, Object… tickData)
    {
    }
    
    @Override
    public void tickEnd(EnumSet<TickType> type, Object... tickData)
    {
    }
    
    @Override
    public EnumSet<TickType> ticks()
    {
        return EnumSet.of(TickType.RENDER, TickType.CLIENT);
    }
    
    @Override
    public String getLabel()
    {
        return "TickClientHandler";
    }
    

    Ajoutez-les bien comme je vous l'ai montré ! Car j'ai un peu modifié certaines méthodes comme celle-ci :

    @Override
    public EnumSet<TickType> ticks()
    {
        return EnumSet.of(TickType.RENDER, TickType.CLIENT);
    }
    

    On a déjà fini ?!
    -Euh... Non... ^^ Loin de là même. 😉

    Maintenant, nous allons passer aux choses sérieuses ! 😄

    Tout en bas de votre classe, créez un void statique que nous allons appeler "zoom" et y ajouter un float comme paramètre.
    Ex :

    public static void zoom(float value)
    {
    }
    

    C'est ici que nous allons ajouter une ligne qui va faire appel à vos connaissances Java... J'ai nommé : La reflection ! 🙂
    La plupart du temps, on fait ses propres lignes de reflection java (oui reflection et pas réflexion, la JVM n'a pas de cerveau et ne réfléchit pas ^^), mais grâce à Forge, nous avons une version simplifié de ceci ! 🙂 Et ce, en une ligne !

    C'est bien beau tout cela, mais... C'est quoi cette fameuse "ligne" ?

    Tout simplement celle qui va permettre la modification du zoom. 🙂

    Pourquoi utiliser cette ligne alors que nous pouvions tout simplement appeler cameraZoom de EntityRenderer ?

    Tout simplement que le field cameraZoom n'est pas accessible. Et que pour rendre accessible un field sans modifier la classe qui le contient, c'est là que la reflection java intervient.

    Dans votre methode zoom, ajoutez cette ligne :

    ObfuscationReflectionHelper.setPrivateValue(EntityRenderer.class, FMLClientHandler.instance().getClient().entityRenderer, value, "cameraZoom");
    

    Pour résumer cette ligne : Elle va définir la valeur "value" (nom de notre float dans le paramètre de la méthode) au field cameraZoom (il est appelé en String car cela ne servirait à rien sinon)

    Maintenant que nous avons fait notre fonction zoom, il faut l'utiliser maintenant ! 😄

    Rendez-vous dans la méthode tickEnd et ajoutez ces deux déclarations :

    final Minecraft minecraft = FMLClientHandler.instance().getClient();
    final EntityPlayerSP player = minecraft.thePlayer;
    

    Et pour ceux comme moi qui connaissent les TickHandler, il faut jamais oublier cette condition :

    if (type.equals(EnumSet.of(TickType.CLIENT)))
    {
    }
    

    Et c'est dans cette condition que nous allons rendre notre code utile ! 🙂

    Certains d'entre vous l'aurons compris, nous allons faire une autre condition DANS celle-ci !
    Ajoutez cette autre condition dans la condition que je vous ai montré ci dessus :

    if(VotreClassPrincipale.zoom)
    {
    } else {
    }
    

    Oh tiens, un else ! Mais oui voyons, c'est normal ! 😉

    Remplacez VotreClassPrincipale par le nom de votre class principale.
    Nous allons, une troisième et dernière fois, ajouter une condition qui va vérifier si le joueur est bien à la première personne et n'a aucun GUI d'ouvert !

    if(minecraft.gameSettings.thirdPersonView == 0 && minecraft.currentScreen == null)
    {
    }
    

    Maintenant, on ajoute (enfin) notre zoom(value); ! 😄

    zoom(value);
    

    Remplacez value par la quantité de zoom, pour ce tutoriel, nous allons mettre 6.0F(c'est déjà pas mal).

    Et dans le else de la condition if(VotreClassePrincipale.zoom), ajoutez de nouveau cette même ligne :

    zoom(1.0F);
    

    Pourquoi 1.0F ?
    -1.0 est le zoom par défaut de la caméra. (Donc pour récupérer la vue normal.)

    Votre méthode tickEnd doit ressembler à ça (normalement) :

    public void tickEnd(EnumSet<TickType> type, Object... tickData)
    {
        final Minecraft minecraft = FMLClientHandler.instance().getClient();
        final EntityPlayerSP player = minecraft.thePlayer;
        if (type.equals(EnumSet.of(TickType.CLIENT)))
        {
            if(VotreClassePrincipale.zoom)
            {
                if(minecraft.gameSettings.thirdPersonView == 0 && minecraft.currentScreen == null)
                {
                zoom(6.0F); // ou le nombre que vous voulez, mais 6.0 c'est déjà assez
                }
            }else {
                zoom(1.0F); // on rétabli le zoom
            }
        }
    }
    

    Et voilà, nous avons fini la partie qui consistait à créer le zoom ! 😉
    Maintenant il nous faut appeler le boolean dans notre classe de l'item !

    4. La classe de l'Item

    Dans cette partie, je ne vais pas vous apprendre à créer un item basique, je vous invite à voir le tutoriel de robin pour cela !

    Donc je vais nommer notre classe ItemZoomer !

    Faites ensuite la base de l'item (c'est à dire la classe avec le constructeur ainsi que sa déclaration dans la classe principale, etc..)

    Pour utiliser notre zoom avec l'item, nous aurons besoin d'utiliser la fonction onRightClick de Item.java :

    public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player)
    {
        return stack;
    }
    

    Et c'est là que se joue la touche finale ! 😉

    Juste au dessus de "return stack" ajoutez la condition et ces quelques lignes suivante :

    if(!world.isRemote)
    {
        VotreClassePrincipale.zoom = !VotreClassePrincipale.zoom;
    }
    

    Encore une fois remplacez VotreClassePrincipale par le nom de votre classe principale 🙂

    Et voilà, nous avons créer notre bel item zoomer ! 😛

    5. Le rendu final des classes

    La classe principale (exemple) :

    public static Item itemZoomer;
    

    et dans votre methode d'initialisation :

    itemZoomer = new ItemZoomer(votreID).setCreativeTab(Votre_Creative_Tab).setUnlocalizedName("itemZoomer").setTextureName("monModID:itemZoomer");
    TickRegistry.registerTickHandler(new TickClientHandler(), Side.CLIENT); // car c'est le client qui gère le zoom et non le serveur
    

    Au dessus de votre méthode de pré-initialisation :

    public static boolean zoom;
    

    Le TickClientHandler :

    public class TickClientHandler implements ITickHandler {
    
        @Override
        public void tickStart(EnumSet<TickType> type, Object... tickData) {
            final Minecraft minecraft = FMLClientHandler.instance().getClient();
        }
    
        @Override
        public void tickEnd(EnumSet<TickType> type, Object... tickData)
        {
            final Minecraft minecraft = FMLClientHandler.instance().getClient();
            final EntityPlayerSP player = minecraft.thePlayer;
            if (type.equals(EnumSet.of(TickType.CLIENT)))
            {
                if(VotreClassePrincipale.zoom)
                {
                    if(minecraft.gameSettings.thirdPersonView == 0 && minecraft.currentScreen == null)
                    {
                        zoom(6F);
                    }
                }else {
                    zoom(1.0F);
                }
    
            }
        }
    
        @Override
        public EnumSet<TickType> ticks() {
            return EnumSet.of(TickType.RENDER, TickType.CLIENT);
        }
    
        @Override
        public String getLabel() {
            return "TickClientHandler";
        }
    
        public static void zoom(float value)
        {
            ObfuscationReflectionHelper.setPrivateValue(EntityRenderer.class, FMLClientHandler.instance().getClient().entityRenderer, value, "cameraZoom");
        }
    }
    

    La classe de l'item :

    public class ItemZoomer extends Item{
    
        public ItemZoomer(int i)
        {
            super(i);
        }
    
        @Override
        public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player)
        {
            if(!world.isRemote)
            {
                VotreClassePrincipale.zoom = !VotreClassePrincipale.zoom;
            }
            return stack;
        }
    }
    

    Dans ce tutoriel je n'ai pas mis les packages ou autres trucs que vous êtes censé vous même inclure. (Ce qui explique pourquoi je n'ai pas mis de class principal intégrale dans la partie "rendue final" 🙂

    6. BONUS

    Pour le bonus, pas grand chose... Ah si ! Ajouter un overlay pour donner un petit effet à votre zoom ! 😄

    Overlay ? C'est quoi ça ? 😮

    Ça : http://puu.sh/46id6.png

    Pour se faire, c'est simple, ajoutez cette ligne tout en haut de votre TickHandler :

    public static final ResourceLocation zoomOverlay = new ResourceLocation("votreModID", "textures/blur/votreZoomOverlay.png");
    

    Comme vous l'aurez compris il s'agit d'une texture que nous allons imposer à l'écran ! 🙂

    -ATTENTION-
    La texture de l'overlay doit être en 256x256 ! (si vous faites un téléscope (par exemple), autant vous donner l'overlay : http://puu.sh/46iD2.png Maintenant vous avez un exemple de ce que je veux dire. En effet, la texture semble écrasé, mais in game elle ne le sera pas, car grâce à la méthode que je vais vous montrer, nous allons "étirer" la texture histoire qu'elle ressemble à quelque chose ! 🙂 )

    Donc dans votre classe, ajoutez cette méthode :

    public static void renderTextureOverlay(ResourceLocation s, float f)
    {
        Minecraft minecraft = FMLClientHandler.instance().getClient();
        ScaledResolution scaledresolution = new ScaledResolution(minecraft.gameSettings, minecraft.displayWidth, minecraft.displayHeight);
        int i = scaledresolution.getScaledWidth();
        int j = scaledresolution.getScaledHeight();
        GL11.glEnable(GL11.GL_BLEND);
        GL11.glDisable(GL11.GL_DEPTH_TEST);
        GL11.glDepthMask(false);
        GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
        GL11.glColor4f(1.0F, 1.0F, 1.0F, f);
        GL11.glDisable(GL11.GL_ALPHA_TEST);
        minecraft.getTextureManager().bindTexture(s);
        Tessellator tessellator = Tessellator.instance;
        tessellator.startDrawingQuads();
        tessellator.addVertexWithUV(0.0D, j, -90D, 0.0D, 1.0D);
        tessellator.addVertexWithUV(i, j, -90D, 1.0D, 1.0D);
        tessellator.addVertexWithUV(i, 0.0D, -90D, 1.0D, 0.0D);
        tessellator.addVertexWithUV(0.0D, 0.0D, -90D, 0.0D, 0.0D);
        tessellator.draw();
        GL11.glDepthMask(true);
        GL11.glEnable(GL11.GL_DEPTH_TEST);
        GL11.glEnable(GL11.GL_ALPHA_TEST);
        GL11.glColor4f(1.0F, 1.0F, 1.0F, f);
    }
    

    On a presque fini ! Nous avons préparé ce dont nous avons besoin. 🙂

    Créez une nouvelle condition en dessous de :

    if (type.equals(EnumSet.of(TickType.CLIENT)))
    {
    }
    

    Elle est exactement la même, juste à remplacer CLIENT par RENDER, donc comme ceci :

    if (type.equals(EnumSet.of(TickType.RENDER)))
    {
    }
    

    Et dans cette condition nous allons ajouter encore une AUTRE condition qui va appeler la méthode que nous avons faite ci dessus ! 😄

    if(VotreClassePrincipale.zoom && minecraft.gameSettings.thirdPersonView == 0 && minecraft.currentScreen == null)
    {
        renderTextureOverlay(zoomOverlay, 1.0F);
    }
    

    C'est tout ?!

    Oui, déjà fini ^^

    Voilà ce à quoi votre classe TickHandler devrait ressembler :

    public class TickClientHandler implements ITickHandler
    {
        public static final ResourceLocation zoomOverlay = new ResourceLocation("votreModID", "textures/blur/votreZoomOverlay.png"); //256x256 la texture je vous le rappel ! :D
    
        @Override
        public void tickStart(EnumSet<TickType> type, Object... tickData) {
        }
    
        @Override
        public void tickEnd(EnumSet<TickType> type, Object... tickData)
        {
            final Minecraft minecraft = FMLClientHandler.instance().getClient();
            final EntityPlayerSP player = minecraft.thePlayer;
            if (type.equals(EnumSet.of(TickType.CLIENT)))
            {
                if(VotreClassePrincipale.zoom)
                {
                    if(minecraft.gameSettings.thirdPersonView == 0 && minecraft.currentScreen == null)
                    {
                        zoom(6F);
                    }
                }else {
                    zoom(1.0F);
                }
            }
            if (type.equals(EnumSet.of(TickType.RENDER)))
            {
                if(VotreClassePrincipale.zoom && minecraft.gameSettings.thirdPersonView == 0 && minecraft.currentScreen == null)
                {
                    renderTextureOverlay(zoomOverlay, 1.0F);
                }
            }
        }
    
        public static void renderTextureOverlay(ResourceLocation s, float f)
        {
            Minecraft minecraft = FMLClientHandler.instance().getClient();
            ScaledResolution scaledresolution = new ScaledResolution(minecraft.gameSettings, minecraft.displayWidth, minecraft.displayHeight);
            int i = scaledresolution.getScaledWidth();
            int j = scaledresolution.getScaledHeight();
            GL11.glEnable(GL11.GL_BLEND);
            GL11.glDisable(GL11.GL_DEPTH_TEST);
            GL11.glDepthMask(false);
            GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
            GL11.glColor4f(1.0F, 1.0F, 1.0F, f);
            GL11.glDisable(GL11.GL_ALPHA_TEST);
            minecraft.getTextureManager().bindTexture(s);
            Tessellator tessellator = Tessellator.instance;
            tessellator.startDrawingQuads();
            tessellator.addVertexWithUV(0.0D, j, -90D, 0.0D, 1.0D);
            tessellator.addVertexWithUV(i, j, -90D, 1.0D, 1.0D);
            tessellator.addVertexWithUV(i, 0.0D, -90D, 1.0D, 0.0D);
            tessellator.addVertexWithUV(0.0D, 0.0D, -90D, 0.0D, 0.0D);
            tessellator.draw();
            GL11.glDepthMask(true);
            GL11.glEnable(GL11.GL_DEPTH_TEST);
            GL11.glEnable(GL11.GL_ALPHA_TEST);
            GL11.glColor4f(1.0F, 1.0F, 1.0F, f);
        }
    
        @Override
        public EnumSet<TickType> ticks() {
            // TODO Auto-generated method stub
            return EnumSet.of(TickType.RENDER, TickType.CLIENT);
        }
    
        public static void zoom(float value)
        {
            ObfuscationReflectionHelper.setPrivateValue(EntityRenderer.class, FMLClientHandler.instance().getClient().entityRenderer, value, "cameraZoom");
        }
    
        @Override
        public String getLabel() {
            return "TickClientHandler";
        }
    }
    

    J'espère que ce tutoriel vous aura plu, il m'a beaucoup été demandé, donc je l'ai fait. Et encore il faut que je me relise, car je suis persuadé que j'ai fait des fautes (j'ai passé la journée à faire ce tutoriel ^^).



  • Super tuto 😄
    Je te met 4 étoiles(même si on ne peut pas en mettre sur les tuto validés) car je n'aime pas que l'on me prenne pour un c**

    Remplacez VotreClassPrincipale par le nom de votre class principale.

    PS: bien sur je rigole 😛



  • Super tuto qui me sera utile , mais deux questions :

    • comment changer la touche pour zoomer ? car sur mon objet , le RightClick est déjà utilisé
    • Comment afficher une image lors du zoom ? Pour faire un fusil sniper par exemple

  • Moddeurs confirmés Rédacteurs Administrateurs


  • Administrateurs

    @'Nolan-XX':

    • comment changer la touche pour zoomer ? car sur mon objet , le RightClick est déjà utilisé

    Check le lien de robin 🙂

    @'Nolan-XX':

    • Comment afficher une image lors du zoom ? Pour faire un fusil sniper par exemple

    C'est le bonus ça ^^ Je le ferais quand j'aurais le temps ! 🙂 Car j'ai un système avancé de l'affichage overlay que celui du lien de robin 🙂



  • @'robin4002':

    Pour afficher quelque chose, Overlay :
    https://github.com/MCNanotech/nanotech_mod/blob/master/common/fr/mcnanotech/kevin_68/nanotech_mod/main/core/ClientProxy.java#L84
    https://github.com/MCNanotech/nanotech_mod/blob/master/common/fr/mcnanotech/kevin_68/nanotech_mod/main/client/gui/GuiOverlay.java

    Pour la touche, KeyBindingRegistry, je fais voir pour faire un tutoriel dessus. Et sinon :
    https://github.com/MCNanotech/nanotech_mod/blob/master/common/fr/mcnanotech/kevin_68/nanotech_mod/ultimateGraviSuite/keyboard/KeyboardClient.java

    Ne le prends pas mal , mais j'ai rien compris Oo
    De plus , du peu que j'ai compris de ta classe KeyboardClient , c'est pour effectuer une action en appuyant sur une touche quand un certain objet est équipé , et ce n'est pas ce que je veux faire …


  • Administrateurs

    Et bien c'est simple en fait, dans ton tick client handler, tu mets une condition "if(Keyboard.isKeyDown(Keyboard.KEY_Z))"

    à la place du VotreClassePrincipale.zoom 🙂



  • @'elias54':

    Et bien c'est simple en fait, dans ton tick client handler, tu mets une condition "if(Keyboard.isKeyDown(Keyboard.KEY_Z))"

    à la place du VotreClassePrincipale.zoom 🙂

    Il me dit : KEY_Z cannot be resolved or is not a field

    Et dans la classe de l'objet , je remets if(Keyboard.isKeyDown(Keyboard.KEY_Z)) ?


  • Administrateurs

    Non, dans le tick handler seulement, et as-tu bien importé la bonne classe ? Car il y a deux class Keyboard 😉



  • J'ai importé : net.java.games.input.Keyboard;
    C'était la mauvaise je suppose :s

    et dans la classe de mon Item je mets quoi du coup ?


  • Administrateurs

    Oui c'est la mauvaise. Envoie tes sources en privé je t'arrange le tout 🙂


  • Administrateurs

    Je viens d'ajouter le bonus au tuto ! 🙂 Enjoy.



  • @'elias54':

    #6. BONUS(6. BONUS)

    Pour le bonus, pas grand chose… Ah si ! Ajouter un overlay pour donner un petit effet à votre zoom ! 😄

    Overlay ? C'est quoi ça ? 😮
    -Ça : http://puu.sh/46id6.png

    Pour se faire, c'est simple, ajoutez cette ligne tout en haut de votre TickHandler :

    
    public static final ResourceLocation zoomOverlay = new ResourceLocation("votreModID", "textures/blur/votreZoomOverlay.png");
    
    

    Comme vous l'aurez compris il s'agit d'une texture que nous allons imposer à l'écran ! 🙂

    %(#FF0000)[-ATTENTION-
    La texture de l'overlay doit être en 256x256 ! (si vous faites un téléscope (par exemple), autant vous donner l'overlay : http://puu.sh/46iD2.png Maintenant vous avez un exemple de ce que je veux dire. En effet, la texture semble écrasé, mais in game elle ne le sera pas, car grâce à la méthode que je vais vous montrer, nous allons "étirer" la texture histoire qu'elle ressemble à quelque chose ! 🙂 )]

    Donc dans votre classe, ajoutez cette méthode :

    
    public static void renderTextureOverlay(ResourceLocation s, float f)
    {
    Minecraft minecraft = FMLClientHandler.instance().getClient();
    ScaledResolution scaledresolution = new ScaledResolution(minecraft.gameSettings, minecraft.displayWidth, minecraft.displayHeight);
    int i = scaledresolution.getScaledWidth();
    int j = scaledresolution.getScaledHeight();
    GL11.glEnable(GL11.GL_BLEND);
    GL11.glDisable(GL11.GL_DEPTH_TEST);
    GL11.glDepthMask(false);
    GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
    GL11.glColor4f(1.0F, 1.0F, 1.0F, f);
    GL11.glDisable(GL11.GL_ALPHA_TEST);
    minecraft.func_110434_K().func_110577_a(s);
    Tessellator tessellator = Tessellator.instance;
    tessellator.startDrawingQuads();
    tessellator.addVertexWithUV(0.0D, j, -90D, 0.0D, 1.0D);
    tessellator.addVertexWithUV(i, j, -90D, 1.0D, 1.0D);
    tessellator.addVertexWithUV(i, 0.0D, -90D, 1.0D, 0.0D);
    tessellator.addVertexWithUV(0.0D, 0.0D, -90D, 0.0D, 0.0D);
    tessellator.draw();
    GL11.glDepthMask(true);
    GL11.glEnable(GL11.GL_DEPTH_TEST);
    GL11.glEnable(GL11.GL_ALPHA_TEST);
    GL11.glColor4f(1.0F, 1.0F, 1.0F, f);
    }
    
    

    On a presque fini ! Nous avons préparé ce dont nous avons besoin. 🙂

    Créez une nouvelle condition en dessous de :

    
    if (type.equals(EnumSet.of(TickType.CLIENT)))
    {
    }
    
    

    Elle est exactement la même, juste à remplacer CLIENT par RENDER, donc comme ceci :

    
    if (type.equals(EnumSet.of(TickType.RENDER)))
    {
    }
    
    

    Et dans cette condition nous allons ajouter encore une AUTRE condition qui va appeler la méthode que nous avons faite ci dessus ! 😄

    
    if(VotreClassePrincipale.zoom && minecraft.gameSettings.thirdPersonView == 0 && minecraft.currentScreen == null)
    {
    renderTextureOverlay(zoomOverlay, 1.0F);
    }
    
    

    C'est tout ?!
    -Oui, déjà fini ^^

    Voilà ce à quoi votre classe TickHandler devrait ressembler :

    
    public class TickClientHandler implements ITickHandler
    {
    public static final ResourceLocation zoomOverlay = new ResourceLocation("votreModID", "textures/blur/votreZoomOverlay.png"); //256x256 la texture je vous le rappel ! :D
    
    @Override
    public void tickStart(EnumSet <ticktype>type, Object... tickData) {
    }
    
    @Override
    public void tickEnd(EnumSet <ticktype>type, Object... tickData)
    {
    final Minecraft minecraft = FMLClientHandler.instance().getClient();
    final EntityPlayerSP player = minecraft.thePlayer;
    if (type.equals(EnumSet.of(TickType.CLIENT)))
    {
    if(VotreClassePrincipale.zoom)
    {
    if(minecraft.gameSettings.thirdPersonView == 0 && minecraft.currentScreen == null)
    {
    zoom(6F);
    }
    }else {
    zoom(1.0F);
    }
    }
    if (type.equals(EnumSet.of(TickType.RENDER)))
    {
    if(VotreClassePrincipale.zoom && minecraft.gameSettings.thirdPersonView == 0 && minecraft.currentScreen == null)
    {
    renderTextureOverlay(zoomOverlay, 1.0F);
    }
    }
    }
    
    public static void renderTextureOverlay(ResourceLocation s, float f)
    {
    Minecraft minecraft = FMLClientHandler.instance().getClient();
    ScaledResolution scaledresolution = new ScaledResolution(minecraft.gameSettings, minecraft.displayWidth, minecraft.displayHeight);
    int i = scaledresolution.getScaledWidth();
    int j = scaledresolution.getScaledHeight();
    GL11.glEnable(GL11.GL_BLEND);
    GL11.glDisable(GL11.GL_DEPTH_TEST);
    GL11.glDepthMask(false);
    GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
    GL11.glColor4f(1.0F, 1.0F, 1.0F, f);
    GL11.glDisable(GL11.GL_ALPHA_TEST);
    minecraft.func_110434_K().func_110577_a(s);
    Tessellator tessellator = Tessellator.instance;
    tessellator.startDrawingQuads();
    tessellator.addVertexWithUV(0.0D, j, -90D, 0.0D, 1.0D);
    tessellator.addVertexWithUV(i, j, -90D, 1.0D, 1.0D);
    tessellator.addVertexWithUV(i, 0.0D, -90D, 1.0D, 0.0D);
    tessellator.addVertexWithUV(0.0D, 0.0D, -90D, 0.0D, 0.0D);
    tessellator.draw();
    GL11.glDepthMask(true);
    GL11.glEnable(GL11.GL_DEPTH_TEST);
    GL11.glEnable(GL11.GL_ALPHA_TEST);
    GL11.glColor4f(1.0F, 1.0F, 1.0F, f);
    }
    
    @Override
    public EnumSet <ticktype>ticks() {
    // TODO Auto-generated method stub
    return EnumSet.of(TickType.RENDER, TickType.CLIENT);
    }
    
    public static void zoom(float value)
    {
    ObfuscationReflectionHelper.setPrivateValue(EntityRenderer.class, FMLClientHandler.instance().getClient().entityRenderer, value, "cameraZoom");
    }
    
    @Override
    public String getLabel() {
    return "TickClientHandler";
    }
    
    }
    
    ```</ticktype></ticktype></ticktype>
    

    Le public ```java
    static final ResourceLocation zoomOverlay = new ResourceLocation("votreModID", "textures/blur/votreZoomOverlay.png");

    et le ```java
    minecraft.func_110434_K().func_110577_a(s);
    ``` et```java
    public static void renderTextureOverlay(ResourceLocation s, float f)
    ``` sont soulignés en rouge , je suppose qu'ils n'existent pas en 1.5.2 , donc par quoi les remplacer ?

  • Moddeurs confirmés Rédacteurs Administrateurs

    Oui les resourceLocation c'est en 1.6, en 1.5 c'est entre chose, la même chose que pour les TileEntitySpecialRender il me semble.


  • Administrateurs

    en 1.5.2, vire la ligne public static final ResourceLocation et remplace le ResourceLocation du void par String.

    Ensuite, tu auras une ligne en erreur dans la méthode, remplace la par minecraft.bindTexture("laTextureEtSonChemin.png")



  • @'robin4002':

    Oui les resourceLocation c'est en 1.6, en 1.5 c'est **autre **chose, la même chose que pour les TileEntitySpecialRender il me semble.

    Et je dois faire quoi du coup ?
    Tu sais , je n'ai pas ton niveau …

    @'elias54':

    en 1.5.2, vire la ligne public static final ResourceLocation et remplace le ResourceLocation du void par String.

    Ensuite, tu auras une ligne en erreur dans la méthode, remplace la par minecraft.bindTexture("laTextureEtSonChemin.png")

    J'ai toujours une erreur a bindTexture


  • Administrateurs

    mh..
    renderengine ou quelque chose comme ça… je sais que c'est minecraft.QUELQUECHOSE.bindTexture...



  • Salut d'abord très bien comme tuto mais j'ai un problème , j'ai une erreur à cette ligne

    minecraft.getTextureManager().bindTexture(s);

    Tu aurait une idée si je la suprime sa marche mais j'ai l'image ou il y a toute leS image genre la. Barre de vie , les cœur pourrait tu m'aider


  • Moddeurs confirmés Rédacteurs Administrateurs

    minecraft.func_110434_K().func_110577_a(s); pour les anciennes version de forge.
    Les tutoriels ont été mis à jour pour les nouvelles mapping de mcp : https://www.minecraftforgefrance.fr/topic/166/mise-à-jour-de-tous-les-tutoriels-vers-les-nouvelles-mappings
    Il est mieux d'utiliser une version de forge supérieur à 849.



  • @'robin4002':

    minecraft.func_110434_K().func_110577_a(s); pour les anciennes version de forge.
    Les tutoriels ont été mis à jour pour les nouvelles mapping de mcp : http://www.minecraftforgefrance.fr/showthread.php?tid=188
    Il est mieux d'utiliser une version de forge supérieur à 849.

    j'ai remit a jour le forge mais quand je met la ligne:

    mc.getTextureManager().bindTexture(resourcelocation)
    

    j'ai toujours une erreur a "mc" et a "resourcelocation"


Log in to reply