Rechercher dans la communauté

Affichage des résultats pour les étiquettes 'Vanilla'.

  • Rechercher par étiquettes

    Saisir les étiquettes en les séparant par une virgule.
  • Rechercher par auteur

Type du contenu


Forums

  • Communauté
    • Avant Tout
    • Annonces
    • Présentation des Membres
    • Vos Projets
    • Recrutements
  • Tutoriels
    • La base
    • Vanilla
    • Forge
    • Bukkit
    • Astuces
    • Autre
    • En attente de validation
    • En cours de rédaction
  • Créations
    • Minecraft
    • Jeux & Logiciels
    • Web
    • Suggestions
  • Le Coin Graphique
    • Galeries Personnelles
    • Galeries Publiques
    • Demandes Graphiques
  • Taverne
    • Général
    • Jeux Vidéos
    • Programmation

30 résultats trouvés

  1. Vanilla

    Merci à chaos90 pour son aide par rapport à ce tutoriel! ArmorHUD en Vanilla Cette uvre est mise à disposition selon les termes de laLicence Creative Commons Attribution - Pas dUtilisation Commerciale - Pas de Modification 3.0 non transposé. Tout partage implique que vous citiez l'auteur original. -[iNTRODUCTION]- Nous sommes partis pour un tutoriel pour afficher un ArmorHUD en Vanilla ( code by dermenslof puis modifié par chaos90 ) -[TUTORIEL]- On va commencer par insérer un petit bout de code juste au dessus du ce code ci: public void renderGameOverlay(float par1, boolean par2, int par3, int par4) Nous allons donc ajouter ceci: private void drawItemInToScreen(ItemStack is, int x, int y, float par3, boolean overlay) // On demande au jeu d'afficher l'item sur l'écran { if (is != null) { float an = (float)is.animationsToGo - par3; //On lui dit d'effectuer toute animation par rapport à l'item if (an > 0.0F) { GL11.glPushMatrix(); float dec = 1.0F + an / 5.0F; GL11.glTranslatef((float)(x + 8), (float)(y + 12), 0.0F); GL11.glScalef(1.0F / dec, (dec + 1.0F) / 2.0F, 1.0F); GL11.glTranslatef((float)(-(x + 8)), (float)(-(y + 12)), 0.0F); } itemRenderer.renderItemAndEffectIntoGUI(this.mc.fontRenderer, this.mc.getTextureManager(), is, x, y); //On lui dit de prendre la texture de l'item et de l'afficher sur l'écran if (an > 0.0F) GL11.glPopMatrix(); if (overlay) itemRenderer.renderItemOverlayIntoGUI(this.mc.fontRenderer, this.mc.getTextureManager(), is, 16, y); // Même chose qu'au dessus! } } Nous allons ensuite modifier quelques éléments: if (!this.mc.playerController.enableEverythingIsScrewedUpMode()) // <------- ATTENTION CETTE FONCTION EXISTE DEJA JUSTE A REMPLACER { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); this.mc.getTextureManager().bindTexture(widgetsTexPath); InventoryPlayer var31 = this.mc.thePlayer.inventory; this.zLevel = -90.0F; this.drawTexturedModalRect(var6 / 2 - 91, var7 - 22, 0, 0, 182, 22); this.drawTexturedModalRect(var6 / 2 - 91 - 1 + var31.currentItem * 20, var7 - 22 - 1, 0, 22, 24, 22); this.mc.getTextureManager().bindTexture(icons); GL11.glEnable(GL11.GL_BLEND); OpenGlHelper.glBlendFunc(775, 769, 1, 0); this.drawTexturedModalRect(var6 / 2 - 7, var7 / 2 - 7, 0, 0, 16, 16); OpenGlHelper.glBlendFunc(770, 771, 1, 0); this.mc.mcProfiler.startSection("bossHealth"); this.renderBossHealth(); this.mc.mcProfiler.endSection(); if (this.mc.playerController.shouldDrawHUD()) { this.func_110327_a(var6, var7); } this.mc.mcProfiler.startSection("actionBar"); GL11.glEnable(GL12.GL_RESCALE_NORMAL); RenderHelper.enableGUIStandardItemLighting(); for (var11 = 0; var11 < 9; ++var11) { var12 = var6 / 2 - 90 + var11 * 20 + 2; var13 = var7 - 16 - 3; this.renderInventorySlot(var11, var12, var13, par1); } Puis, juste en dessous de ces nouveaux éléments, rajouter ceci, qui va faire afficher au jeu le HUD: ItemStack is; //render itemArmor for (int i = 0; i < 4; ++i) { is = this.mc.thePlayer.inventory.armorItemInSlot(4 - i - 1); if (is == null) continue; drawItemInToScreen(is, 0, i * 17, par1, true); this.mc.fontRenderer.drawString("§f§l" + (is.getMaxDamage() - is.getItemDamageForDisplay()), 18, i * 17 + 5, 0); } //render itemInHand is = this.mc.thePlayer.inventory.getCurrentItem(); if (is != null) { Item i = is.getItem(); boolean outils = i instanceof Item; if (!i.isItemTool(is) || outils && !(i instanceof ItemArmor)) { drawItemInToScreen(is, 40, 1 * 5, par1, false); GL11.glDisable(GL11.GL_BLEND); this.mc.fontRenderer.drawString("" + "§n§lDurabilité :§r§c§l " + (is.getMaxDamage() - is.getItemDamageForDisplay()) + " §r§n§lQuantité :§r§c§l " + is.stackSize, 60, 1 * 5 + 5, 553648127); } } RenderHelper.disableStandardItemLighting(); GL11.glDisable(GL12.GL_RESCALE_NORMAL); this.mc.mcProfiler.endSection(); GL11.glDisable(GL11.GL_BLEND); } -[CONCLUSION]- Voilà, votre HUD s'affiche désormais! Je ne me suis pas amuser à tout décoder, mais si l'envie vous en viens, n'hésitez pas! /!\ Je me répète, mais le code est de dermenslof , puis modifié par chaos90, pas de moi! Sur ce, bon jeu avec votre ArmorHUD EDIT de Dermenslof: j'assume rien du tout, à la base c'est mon code mais pas les modifs apportées totalement aberrantes (genre: boolean outils = i instanceof Item; et j'en passe)
  2. Les GUIs dans Minecraft Cette uvre est mise à disposition selon les termes de la Licence Creative Commons Attribution - Pas dUtilisation Commerciale - Pas de Modification 3.0 non transposé . Tout partage implique que vous citiez l'auteur original. -[iNTRODUCTION]- Salut tout le monde ! En ce moment la plupart des demandes d'aide ont rapport avec les GUI. Contrairement à ce que croient la plupart d'entre vous, ce n'est vraiment pas compliqué. Mais un tutoriel sera surement fort utile. Ce tutoriel fonctionne pour la 1.7, la 1.8, et surement (peut-être avec quelques modifications) pour la 1.6, où même peut-être pour la 1.5, ou moins. -[sOMMAIRE]- 1] Préparation 2] Les éléments de GUI 3] Les GUI Containers 4] Créer votre propre objet Gui (composant) 5] Codes et astuces ! 1] Préparation Donc, premièrement, pour créer un menu, il faut créer un GuiScreen, pour ça, il faut créer notre classe qui extends de GuiScreen : public class MonGui extends GuiScreen { } C'est si simple que ça ! Donc, il y a deux méthodes importantes, les voicis : initGui() : @Override public void initGui() { super.initGui(); } Cette méthode n'est exécutée que lorsque le Gui est créé, (quand le Gui s'affiche ou que la fenêtre est redimensionnée) drawScreen(int mouseX, int mouseY, float partialTicks) : @Override public void drawScreen(int mouseX, int mouseY, float partialTicks) { super.drawScreen(mouseX, mouseY, partialTicks); } Le nom des arguments parlent d'eux mêmes ! Cette méthode est exécutée le plus souvent possible (à chaque tour de MC, pour info si les FPS sont à 65 par exemple, cette méthode sera exécutée 65 par seconde !) Voilà ! C'est tout pour cette préparation ! 2] Les éléments de GUI Donc, on va voir les différents éléments de Gui et comment les utiliser ! GuiButton : Pour créer un bouton il suffit de l'enregistrer dans la liste de bouton dans la méthode initGui, comme ceci : this.buttonList.add(new GuiButton(x, y, WIP)); 3] Les GUI Containers 4] Créer votre propre objet Gui (composant) 5] Codes et astuces WORK IN PROGRESS
  3. Afficher un message central Cette uvre est mise à disposition selon les termes de la Licence Creative Commons Attribution - Pas dUtilisation Commerciale - Pas de Modification 3.0 non transposé . Tout partage implique que vous citiez l'auteur original. -[iNTRODUCTION]- Salut tout le monde ! Nous allons expliquer dans cette astuce comment afficher un message au centre de l'écran. Vous verrez, ça n'est pas bien compliqué. -[PR-REQUIS]- -[sOMMAIRE]- 1] Explications pas à pas 2] Résultat final 1] Explications pas à pas Les messages du chat sont reçus par packets lors de la phase de jeu « play ». Lors de leur réception, la méthode NetHandlerPlayerClient.handleChat(S02PacketChat) est appelée. Elle affiche simplement le message reçu dans le chat (via la GuiIngame) : public void handleChat(S02PacketChat packetChat) // Un peu de renommage ne fait pas de mal { this.gameController.ingameGUI.getChatGUI().func_146227_a(packetChat.func_148915_c()); } Ce que nous allons faire, est simplement empêcher le message d'être affiché dans le chat s'il commence par « ~ » ou par «[bROADCAST] ». Le texte non formatté du message (sans les couleurs et autres) peut être récupéré sur le IChatComponent renvoyé par S02PacketChat.func_148915_c(). Nous allons donc remplacer la méthode par : public void handleChat(S02PacketChat packetChat) { /** * Le message qui a été reçu. */ IChatComponent chatComponent = packetChat.func_148915_c(); /** * Le texte non formatté reçu. */ String unformattedText = chatComponent.getUnformattedText(); // Si il s'agit d'un broadcast if (unformattedText.startsWith(" ~") || unformattedText.startsWith("[BROADCAST] ")) { // On l'affiche en tant que tel this.gameController.ingameGUI.showCenterMessage(chatComponent.getFormattedText()); } else { // Sinon on affiche le message dans le chat this.gameController.ingameGUI.getChatGUI().func_146227_a(chatComponent); } } Il nous faut ensuite créer la méthode showCenterMessage(String) dans GuiIngame. public void showCenterMessage(String formattedText) { } Pour la faire fonctionner, nous aurons besoin de 2 fields, qu'il nous faut déclarer au dessus : /** * Dans cette variable sera stocké le message à afficher. */ private String displayedCenterMessage = null; /** * Le temps restant du message à afficher (en ticks). */ private int centerMessageTimer = 0; Nous pouvons maintenant remplir la méthode. Comme vous pouvez le constater, elle ne fait que remplir les fields. public void showCenterMessage(String formattedText) { displayedCenterMessage = formattedText; centerMessageTimer = 3 * 20; // 3 * 20 ticks = 3 secondes } Ensuite, il faut afficher le texte entré dans displayedCenterMessage. Pour cela, nous nous rendons dans GuiIngame.renderGameOverlay, et en dessous du if suivant : if (!this.mc.playerController.enableEverythingIsScrewedUpMode()) On peut ajouter le code de rendu : if (displayedCenterMessage != null) { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); // Transparence du message int alpha = centerMessageTimer < 10 ? ((int) (centerMessageTimer * 25)) : 255; // Couleur de base du message (simplement blanc auquel on a ajouté la transparence) int color = 0xffffff | ((alpha & 255) << 24); // On dessine le message centré avec la couleur calculée this.mc.fontRenderer.drawString(displayedCenterMessage, (var6 - this.mc.fontRenderer.getStringWidth(displayedCenterMessage)) / 2, var7 / 2 - 15, color); } Il ne nous reste maintenant plus qu'à décrémenter le timer et à vider la variable displayedCenterMessage si le temps est écoulé. Nous nous rendons dans GuiIngame.updateTick, et nos ajoutons ce code tout au début de la fonction : // Si on est en train d'afficher un message... if (this.centerMessageTimer > 0) { // On réduit le temps restant this.centerMessageTimer--; // Et si le temps est écoulé... if (this.centerMessageTimer == 0) { // On arrête d'afficher le message displayedCenterMessage = null; } } Et c'est tout ! 2] Résultat final Dans NetHandlerPlayerClient.handleChat(S02PacketChat) : public void handleChat(S02PacketChat packetChat) { /** * Le message qui a été reçu. */ IChatComponent chatComponent = packetChat.func_148915_c(); /** * Le texte non formatté reçu. */ String unformattedText = chatComponent.getUnformattedText(); // Si il s'agit d'un broadcast if (unformattedText.startsWith(" ~") || unformattedText.startsWith("[BROADCAST] ")) { // On l'affiche en tant que tel this.gameController.ingameGUI.showCenterMessage(chatComponent.getFormattedText()); } else { // Sinon on affiche le message dans le chat this.gameController.ingameGUI.getChatGUI().func_146227_a(chatComponent); } } Dans GuiIngame : /** * Dans cette variable sera stocké le message à afficher. */ private String displayedCenterMessage = null; /** * Le temps restant du message à afficher (en ticks). */ private int centerMessageTimer = 0; public void showCenterMessage(String formattedText) { displayedCenterMessage = formattedText; centerMessageTimer = 3 * 20; // 3 * 20 ticks = 3 secondes } Dans GuiIngame.renderGameOverlay : if (displayedCenterMessage != null) { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); // Transparence du message int alpha = centerMessageTimer < 10 ? ((int) (centerMessageTimer * 25)) : 255; // Couleur de base du message (simplement blanc auquel on a ajouté la transparence) int color = 0xffffff | ((alpha & 255) << 24); // On dessine le message centré avec la couleur calculée this.mc.fontRenderer.drawString(displayedCenterMessage, (var6 - this.mc.fontRenderer.getStringWidth(displayedCenterMessage)) / 2, var7 / 2 - 15, color); } Dans GuiIngame.updateTick : // Si on est en train d'afficher un message... if (this.centerMessageTimer > 0) { // On réduit le temps restant this.centerMessageTimer--; // Et si le temps est écoulé... if (this.centerMessageTimer == 0) { // On arrête d'afficher le message displayedCenterMessage = null; } } Merci d'avoir suivi cette astuce, n'hésitez pas à laisser vos commentaires !
  4. Vanilla

    je sais que tout le monde attendent à ce que quelqu'un fasse un tutoriel en VANILLA pour le StatusEffectHUD alors je l'ai fais et je vous le fais partager StatusEffectHUD en Vanilla -[iNTRODUCTION]- Bonjour à tous ! Dans ce tutoriel, nous allons faire un StatusEffectHUD commençons sans attendre -[sOMMAIRE]- 1]Création d'un "if" 2]Création d'un "for" 3]LesIcônes 4] Afficher les niveaux des effets 1]Création d'un "if" Tout d'abord on va aller dans le GuiIngame.java puis on va aller dans RenderGameOverlay mettre nos codes en dessus de ces 3 int : int var11; int var12; int var13; qui est en dessus de ce if : if (!this.mc.thePlayer.isPotionActive(Potion.confusion)) { float var10 = this.mc.thePlayer.prevTimeInPortal + (this.mc.thePlayer.timeInPortal - this.mc.thePlayer.prevTimeInPortal) * par1; if (var10 > 0.0F) { this.func_130015_b(var10, var6, var7); } } donc maintenant on va mettre notre if qui va dire que si il y a plus de 5 potion d'activer ça les empiles mais pour ça il faut déja mettre notre Collection pour les potions et aussi un int les voici : Collection ph1 = this.mc.thePlayer.getActivePotionEffects(); int ph2 = 33; j'ai mis ph pour PotionHUD maintenant le if c'est : if (ph1.size() > 5) //si les effect de potion activé est supérieur a 5 alors ... { ph2 = 132 / (ph1.size() - 1); ... il s'empile avec ces valeurs } 2]Création d'un "for" pour le "for" on va mettre tout ce qu'il faut pour que les effect de potion s'affiche avec le temps l'icone et le nom de la potion donc pour ça le "for" sera : for (Iterator ph3 = this.mc.thePlayer.getActivePotionEffects().iterator(); ph3.hasNext(); var2 += ph2) { donc ici on a crée un Iterator qui va donc nous permettre d'avencer sauf que normalement vous avez une erreur sur me var2 et nous allons ajouter en même un autre var qui nous servira plus bas donc plus haut avant le if il suffis de mettre ceci : int var2 = 0; int var1 = 0; donc maintenant dans notre for on va rajouter quelque variables pour qu'il aille chercher les effets de potions : PotionEffect ph4 = (PotionEffect)ph3.next(); Potion ph5 = Potion.potionTypes[ph4.getPotionID()]; // ici on va chercher le type de potion qui est actif GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); pour le text c'est avec le niveaux des potion donc c'est plus bas maintenant on a just le nom de la potion qui s'affiche maintenant on veut sa durée : this.mc.fontRenderer.drawStringWithShadow(Potion.getDurationString(ph4), var1 + 10 + 18, var2 + 6 + 10, 8355711); //ici on affiche la duré de l'effet en court ce qui nous donne pour le moment ceci : //début du code PotionEffectHUD int var1 = 0; int var2 = 0; int ph2 = 33; Collection ph1 = this.mc.thePlayer.getActivePotionEffects(); if (ph1.size() > 5) { ph2 = 132 / (ph1.size() - 1); } for (Iterator ph3 = this.mc.thePlayer.getActivePotionEffects().iterator(); ph3.hasNext(); var2 += ph2) { PotionEffect ph4 = (PotionEffect)ph3.next(); Potion ph5 = Potion.potionTypes[ph4.getPotionID()]; GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); this.mc.fontRenderer.drawStringWithShadow(Potion.getDurationString(ph4), var1 + 10 + 18, var2 + 6 + 10, 8355711); } //fin code PotionEffectHUD 3] LesIcônes maintenant il faut afficher certaine chose comme le contour (ou pas si vous voulez pas il suffis de retirer le code que je vais vous donner) et les icônes donc pour les icônes on va déjà rajouter un bindTexture tout en haut du GuiIngame.java : protected static final ResourceLocation inventory = new ResourceLocation("textures/gui/container/inventory.png"); voilà et dans notre "for" on va rajouter en dessus de : GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); on va mettre : this.mc.getTextureManager().bindTexture(inventory); // ici on va chercher la texture maintenant on va chercher les icônes dans ce .png donc on ajouter un if : if (ph5.hasStatusIcon()) { int ph6 = ph5.getStatusIconIndex(); this.drawTexturedModalRect(var1 + 6, var2 + 7, 0 + ph6 % 8 * 18, 198 + ph6 / 8 * 18, 18, 18); //on va chercher l'icône et on le place ou il faut } si vous voulez le contour il suffis d'ajouter cette ligne au dessus du if des icônes : this.drawTexturedModalRect(var1, var2, 0, 166, 140, 32); // ici on affiche le contour si vous avez envis d'enlever le contour il suffis d'enlever cette ligne 4] Afficher les niveaux des effets donc pour afficher le niveaux des effets on va déja rajouter en dessus de notre deuxième if pour afficher les icônes un String qui va chercher le nom en fonction de leur ID : String ph7 = I18n.format(ph5.getName()/*ici il cherche le nom*/, new Object[0]); maintenant que on a ça on va pouvoir afficher le niveau pour cela rien de plus simple on fais des "if" et des "else if" donc on commence par le niveau 2 car le niveau 1 ne s'affiche pas donc on met : if (ph4.getAmplifier() == 1) // si la potion a un niveau de 1 qui est le niveau 2 car le niveau 1 c'est 0 alors .... { ph7 = ph7 + " II" ;// ... on affiche a coté du nom de la potion "II" } et maintenant on va faire ça pour 4 niveaux donc en dessus de ça on ajoute : else if (ph4.getAmplifier() == 2)// si la potion a un niveau de 2 qui est 3 alors ... { ph7 = ph7 + " III"; // on affiche a coté du nom de la potion "III" } else if (ph4.getAmplifier() == 3) // si la potion a un niveau de 3 qui est 4 alors ... { ph7 = ph7 + " IV"; // on affiche a coté du nom de la potion "IV" } maintenant que on a ça il faut le placer donc en dessous du if on ajoute : this.mc.fontRenderer.drawStringWithShadow(ph7, var1 + 10 + 18, var2 + 6, 16777215); //ici on place le nom de la potion ou il faut ce qui nous donne au finale tout ceci : //début du code PotionEffectHUD int var1 = 0; int var2 = 0; int ph2 = 33; Collection ph1 = this.mc.thePlayer.getActivePotionEffects(); if (ph1.size() > 5) { ph2 = 132 / (ph1.size() - 1); } for (Iterator ph3 = this.mc.thePlayer.getActivePotionEffects().iterator(); ph3.hasNext(); var2 += ph2) { PotionEffect ph4 = (PotionEffect)ph3.next(); Potion ph5 = Potion.potionTypes[ph4.getPotionID()]; GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); this.mc.getTextureManager().bindTexture(inventory); this.drawTexturedModalRect(var1, var2, 0, 166, 140, 32); if (ph5.hasStatusIcon()) { int ph6 = ph5.getStatusIconIndex(); this.drawTexturedModalRect(var1 + 6, var2 + 7, 0 + ph6 % 8 * 18, 198 + ph6 / 8 * 18, 18, 18); } String ph7 = I18n.format(ph5.getName(), new Object[0]); if (ph4.getAmplifier() == 1) { ph7 = ph7 + " II" ; } else if (ph4.getAmplifier() == 2) { ph7 = ph7 + " III"; } else if (ph4.getAmplifier() == 3) { ph7 = ph7 + " IV"; } this.mc.fontRenderer.drawStringWithShadow(ph7, var1 + 10 + 18, var2 + 6, 16777215); this.mc.fontRenderer.drawStringWithShadow(Potion.getDurationString(ph4), var1 + 10 + 18, var2 + 6 + 10, 8355711); } //fin code PotionEffectHUD voilà le tutoriel est terminé bon jeu avec votre StatusEffectHUD !
  5. Vanilla

    Bonjour a tous, pour commencer, désolé de la mise en page mais je n'ai jamais fait de tutoriel ici. Aujourd'hui, nous allons créer une nouvelle armure. Le matériel : - MCP ( Minecraft Coder Pack ) de la version que vous voulez - Eclipse - Un ordinateur ... Ajout de l'armure : Tout d'abord, rendez-vous dans la classe Item.java Rendez-vous à la fin de la déclaration des items Ensuite, ajoutez ce code : ! Ajoutez le dans Item.java ! itemRegistry.addObject(ID, "NOM", (new ItemArmor(ItemArmor.ArmorMaterial.MINERAIS, 5, 0)).setUnlocalizedName("NOM").setTextureName("NOM-TEXTURE")); itemRegistry.addObject(ID, "NOM", (new ItemArmor(ItemArmor.ArmorMaterial.MINERAIS, 5, 1)).setUnlocalizedName("NOM").setTextureName("NOM-TEXTURE")); itemRegistry.addObject(ID, "NOM", (new ItemArmor(ItemArmor.ArmorMaterial.MINERAIS, 5, 2)).setUnlocalizedName("NOM").setTextureName("NOM-TEXTURE")); itemRegistry.addObject(ID, "NOM", (new ItemArmor(ItemArmor.ArmorMaterial.MINERAIS, 5, 3)).setUnlocalizedName("NOM").setTextureName("NOM-TEXTURE")); Maintenant , ajoutons nos armures dans Items.java public static final ItemArmor NOM = (ItemArmor)Item.itemRegistry.getObject("NOM"); public static final ItemArmor NOM = (ItemArmor)Item.itemRegistry.getObject("NOM"); public static final ItemArmor NOM = (ItemArmor)Item.itemRegistry.getObject("NOM"); public static final ItemArmor NOM = (ItemArmor)Item.itemRegistry.getObject("NOM"); Là, votre armure est créée mais elle n'a pas encore de durabilité La durabilité de votre armure : Donc, rendez-vous dans : ItemArmor.java En dessous de celle du diamant, ajoutez cette ligne : MINERAIS("MINERAIS", 8, 50, new int[]{8, 13, 11, 8}, 6); Vous pouvez remarquer qu'il y a une erreur. Pour y remédier, il suffit de remplacer CA : DIAMOND("DIAMOND", 4, 33, new int[]{3, 8, 6, 3}, 10); PAR CA : DIAMOND("DIAMOND", 4, 33, new int[]{3, 8, 6, 3}, 10), ! Ajoutez toujours votre minerais en dernier ! Ici, on va s'occuper de la durabilité et de la résistance des objets MINERAIS("MINERAIS", 7, 50, new int[]{8, 13, 11, 8}, 6); Remplacez MINERAIS par le nom de votre minerais ! TOUJOURS EN MAJUSCULES ! Le 7 représente son ordre (si le diamant est 4 alors votre minerais devient 5) Là, le 50 représente la durabilité de l'armure Le 8 est la résistance du casque Le 13 est la résistance du plastron Le 11 est la résistance du pantalon Le 8 (le dernier) est la résistance des bottes Le 6, c'est l'enchantement de l'armure (plus c'est bas, plus les enchantements sont rares) Mon exemple : SAPPHIRE("SAPPHIRE", 8, 55, new int[]{9, 18, 17, 6}, 9); Maintenant, vous pouvez remplacer dans votre code le '.MINERAIS' par '.VOTREMINERAIS' Comme ceci : itemRegistry.addObject(ID, "NOM", (new ItemArmor(ItemArmor.ArmorMaterial.SAPPHIRE, 5, 0)).setUnlocalizedName("NOM").setTextureName("NOM-TEXTURE")); itemRegistry.addObject(ID, "NOM", (new ItemArmor(ItemArmor.ArmorMaterial.SAPPHIRE, 5, 1)).setUnlocalizedName("NOM").setTextureName("NOM-TEXTURE")); itemRegistry.addObject(ID, "NOM", (new ItemArmor(ItemArmor.ArmorMaterial.SAPPHIRE, 5, 2)).setUnlocalizedName("NOM").setTextureName("NOM-TEXTURE")); itemRegistry.addObject(ID, "NOM", (new ItemArmor(ItemArmor.ArmorMaterial.SAPPHIRE, 5, 3)).setUnlocalizedName("NOM").setTextureName("NOM-TEXTURE")); Donner une texture quand l'armure est sur vous : Petite astuce : Si vous ne trouvez pas le RenderBiped.java, crivez le puis sélectionnez le puis -> Clique droit -> Open declaration Pour finir , rendez-vous dans la classe : RenderBiped.java Là, vous voyez cette ligne ( normalement ) private static final String[] bipedArmorFilenamePrefix = new String[] {"leather", "chainmail", "iron", "diamond", "gold"}; A la fin, mettez une virgule ( , ) puis entre ( " " ), le nom de votre armure Exemple : Si vos textures d'armure s'appellent : Sapphire_layer_1 et Sapphire_layer_2 Entre les ( " " ) mettez : Sapphire Exemple : private static final String[] bipedArmorFilenamePrefix = new String[] {"leather", "chainmail", "iron", "diamond", "gold", "sapphire"}; Et voilà, vous avez votre armure ! Il ne vous reste que a mettre vos textures ! Infos supplémentaires : En cas de non-compréhension , ajoutez moi sur skype , je vous aiderai comme je peut Mon skype : Anthony.delfleur
  6. Mise à jour Minicraft Quest / Manager Bonjour, notre serveur utilise le Mod Vanilla [Minicraft Quest] & [Minicraft Manager] par Diwaly. Le projet est en version 1.8.8 et les sources sont disponibe sur Bitbucket, J'ai demandé la permission au Dev de mettre à jour son projet. J'ai besoin d'un Dev pour rendre le projet compatible en version 1.11.2 Les client doit être modifié avec des source disponible sur bitbucket, quelques modifications sont nécéssaire ca les sources sont concus pour un client 1.8 Le serveur spigot 1.11.2 doit aussi être modifié avec les sources fournie dans le bitbucket, Un fichier texte explique les modifications a apporter au client et au serveur. 2 plugins doivent être modifié pour fonctionner avec le spigot 1.11.2 et ajout des nouveaux blocks et mobs. Prerequisite: Utilisation de MCP Moding Java Vanilla Manipulation de packets Utilisation de Eclipse Connaissance de l'API Spigot Connaissance SQL Sources et documentation: Minicraft Manager Minicraft Quest Projet sur Curse Site Web du Dev La paye / Délais: J'ai un budget d'environ 200-250 Euros pour compléter les travaux Les travaux doivent être complété dans un Délais de 1 mois Contact: Email: nicecube@hotmail.com Skype: marc.andre.b Discord serveur MCQC * J'ai une bonne idée de comment débuter le projet avec la mise a jour du client mais je n'ai pas les connaissances requise pour effectuer les modifications
  7. Bonjour, la commu' IronCraft ! PS : Dans le futur je vais update ce post en 1.8 Introduction Vous voulez créer un item qui peux faire à la fois Pioche,Hache et pelle ? Ehh bien vous êtes très bien arrivez car ce tutoriel est fais pour sa ! Sommaire Coté Client 1 ► Création de l'item dans Item.java 2 ► Création de la classe Paxel.java Coté Spigot 1 ► Création de l'item dans Item.java 2 ► Création de la classe Paxel.java 1) Création de l'item dans Item.java (Coté Client) Bon commençons ! Tous d'abord nous devons répertorié notre futur item dans Item.java et Items.java dans le moment vous devriez faire ceci sans trop de difficulté. Voilà à quoi sa devrais ressemblé dans Item.java : itemRegistry.addObject(ID, "Nom de l'item", new Paxel(Item.ToolMaterial.NIVEAUDEMATERIEL).setCreativeTab(CreativeTabs.tabInventory).setUnlocalizedName("Nom de l'item").setTextureName("Nom de la texture de l'item")); Logiquement vous devriez avoir une erreur car la classe Paxel n'est pas encore créer donc si vous avez une erreur c'est totalement normal.. Et dans Items.java sa devrais ressemblé à sa : public static final Item NomItem = (Item)Item.itemRegistry.getObject("Nom de l'item"); Voilà si vous avez fais sa pour le reste vous devriez vous en sortir ;) Passons à la créations de la classe Paxel 2) Création de la classe Paxel.java (Coté Client) Passons au plus intéressant tous d'abord créer votre classe Paxel et l'extends en ItemTool et pas oubliez pas de générer les constructeurs sa devrais ressemblé à sa : package fr.reizam.api; import java.util.Set; import net.minecraft.item.ItemTool; public class Paxel extends ItemTool{ protected Paxel(float p_i45333_1_, ToolMaterial p_i45333_2_, Set p_i45333_3_) { super(p_i45333_1_, p_i45333_2_, p_i45333_3_); // TODO Auto-generated constructor stub } } Tous d'abord supprimé le float p_i45333_1 et le Set p_i45333_3 car nous n'avons pas besoin pour ce tutoriel. Juste après il va falloir répertorié tous les blocks qu'il faudra casser heureusement j'ai déjà tous fais comme sa vous n'aurez pas à vous cassez la tête a tous récrire les blocks du coup déclaré ceci haut dessus de mon constructor Paxel: private static final Set BlocksRegistered = Sets.newHashSet(new Block[] {Blocks.cobblestone, Blocks.double_stone_slab, Blocks.stone_slab, Blocks.stone, Blocks.sandstone, Blocks.mossy_cobblestone, Blocks.iron_ore, Blocks.iron_block, Blocks.coal_ore, Blocks.gold_block, Blocks.gold_ore, Blocks.diamond_ore, Blocks.diamond_block, Blocks.ice, Blocks.netherrack, Blocks.lapis_ore, Blocks.lapis_block, Blocks.redstone_ore, Blocks.lit_redstone_ore, Blocks.rail, Blocks.detector_rail, Blocks.golden_rail, Blocks.activator_rail,Blocks.planks, Blocks.bookshelf, Blocks.log, Blocks.log2, Blocks.chest, Blocks.pumpkin, Blocks.lit_pumpkin,Blocks.grass, Blocks.dirt, Blocks.sand, Blocks.gravel, Blocks.snow_layer, Blocks.snow, Blocks.clay, Blocks.farmland, Blocks.soul_sand, Blocks.mycelium}); Vous pouvez si vous voulez rajoutez des blocks dans la HashSet ! Et n'oubliez pas dans le super de mettre le nom de variable du Set pour qu'il soit bien répertorié aussi non sa ne marchera pas comme ceci : super(p_i45333_1_, p_i45333_2_, BlocksRegistered); Mais ce n'est pas tous ! Car oui dans chaque pelle,pioche et hache il y a toujours des blocks spéciale qui vont cassé un peu moins/plus rapide donc pour ce faire il faudra rajouter 2 méthodes (func_150897_b et func_150893_a) Pour ce faire j'ai déjà fait les méthodes pour vous mais je vais quand même vous expliqué ! Tous d'abord insérée ces deux methods : public boolean func_150897_b(Block p_150897_1_) { return p_150897_1_ == Blocks.snow_layer ? true : p_150897_1_ == Blocks.snow && p_150897_1_ == Blocks.obsidian ? this.toolMaterial.getHarvestLevel() == 3 : (p_150897_1_ != Blocks.diamond_block && p_150897_1_ != Blocks.diamond_ore ? (p_150897_1_ != Blocks.emerald_ore && p_150897_1_ != Blocks.emerald_block ? (p_150897_1_ != Blocks.gold_block && p_150897_1_ != Blocks.gold_ore ? (p_150897_1_ != Blocks.iron_block && p_150897_1_ != Blocks.iron_ore ? (p_150897_1_ != Blocks.lapis_block && p_150897_1_ != Blocks.lapis_ore ? (p_150897_1_ != Blocks.redstone_ore && p_150897_1_ != Blocks.lit_redstone_ore ? (p_150897_1_.getMaterial() == Material.rock ? true : (p_150897_1_.getMaterial() == Material.iron ? true : p_150897_1_.getMaterial() == Material.anvil)) : this.toolMaterial.getHarvestLevel() >= 2) : this.toolMaterial.getHarvestLevel() >= 1) : this.toolMaterial.getHarvestLevel() >= 1) : this.toolMaterial.getHarvestLevel() >= 2) : this.toolMaterial.getHarvestLevel() >= 2) : this.toolMaterial.getHarvestLevel() >= 2); } public float func_150893_a(ItemStack p_150893_1_, Block p_150893_2_) { return p_150893_2_.getMaterial() != Material.wood && p_150893_2_.getMaterial() != Material.plants && p_150893_2_.getMaterial() != Material.vine && p_150893_2_.getMaterial() != Material.iron && p_150893_2_.getMaterial() != Material.anvil && p_150893_2_.getMaterial() != Material.rock ? super.func_150893_a(p_150893_1_, p_150893_2_) : this.efficiencyOnProperMaterial; } La question est pourquoi la méthodes func_150897_b est là ? Car tous simplement nous allons comme exemple l'obsidian qui lui nécessite une pioche en diamant pour le récupérer justement comme vous pouvez voir cet méthode retourne un boolean (Vrai ou faux) donc ce qui veux dire en gros trés gros Si pioche en diamant alors drop l'item au sol. Et la méthodes func_150893_a ? Cet methodes retourne juste le niveau d’efficacité pour certain Item/Block. Donc voilà n'oubliez pas dans le super de précisez le float au début comme ceci : protected Paxel(ToolMaterial p_i45333_2_) { super(3.0F, p_i45333_2_, BlocksRegistered); } Et voilà dans votre class Paxel vous devriez avoir maintenant : package fr.reizam.api; import java.util.Set; import com.google.common.collect.Sets; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemTool; public class Paxel extends ItemTool{ private static final Set BlocksRegistered = Sets.newHashSet(new Block[] {Blocks.cobblestone, Blocks.double_stone_slab, Blocks.stone_slab, Blocks.stone, Blocks.sandstone, Blocks.mossy_cobblestone, Blocks.iron_ore, Blocks.iron_block, Blocks.coal_ore, Blocks.gold_block, Blocks.gold_ore, Blocks.diamond_ore, Blocks.diamond_block, Blocks.ice, Blocks.netherrack, Blocks.lapis_ore, Blocks.lapis_block, Blocks.redstone_ore, Blocks.lit_redstone_ore, Blocks.rail, Blocks.detector_rail, Blocks.golden_rail, Blocks.activator_rail,Blocks.planks, Blocks.bookshelf, Blocks.log, Blocks.log2, Blocks.chest, Blocks.pumpkin, Blocks.lit_pumpkin,Blocks.grass, Blocks.dirt, Blocks.sand, Blocks.gravel, Blocks.snow_layer, Blocks.snow, Blocks.clay, Blocks.farmland, Blocks.soul_sand, Blocks.mycelium}); protected Paxel(ToolMaterial p_i45333_2_) { super(3.0F, p_i45333_2_, BlocksRegistered); } public boolean func_150897_b(Block p_150897_1_) { return p_150897_1_ == Blocks.snow_layer ? true : p_150897_1_ == Blocks.snow && p_150897_1_ == Blocks.obsidian ? this.toolMaterial.getHarvestLevel() == 3 : (p_150897_1_ != Blocks.diamond_block && p_150897_1_ != Blocks.diamond_ore ? (p_150897_1_ != Blocks.emerald_ore && p_150897_1_ != Blocks.emerald_block ? (p_150897_1_ != Blocks.gold_block && p_150897_1_ != Blocks.gold_ore ? (p_150897_1_ != Blocks.iron_block && p_150897_1_ != Blocks.iron_ore ? (p_150897_1_ != Blocks.lapis_block && p_150897_1_ != Blocks.lapis_ore ? (p_150897_1_ != Blocks.redstone_ore && p_150897_1_ != Blocks.lit_redstone_ore ? (p_150897_1_.getMaterial() == Material.rock ? true : (p_150897_1_.getMaterial() == Material.iron ? true : p_150897_1_.getMaterial() == Material.anvil)) : this.toolMaterial.getHarvestLevel() >= 2) : this.toolMaterial.getHarvestLevel() >= 1) : this.toolMaterial.getHarvestLevel() >= 1) : this.toolMaterial.getHarvestLevel() >= 2) : this.toolMaterial.getHarvestLevel() >= 2) : this.toolMaterial.getHarvestLevel() >= 2); } public float func_150893_a(ItemStack p_150893_1_, Block p_150893_2_) { return p_150893_2_.getMaterial() != Material.wood && p_150893_2_.getMaterial() != Material.plants && p_150893_2_.getMaterial() != Material.vine && p_150893_2_.getMaterial() != Material.iron && p_150893_2_.getMaterial() != Material.anvil && p_150893_2_.getMaterial() != Material.rock ? super.func_150893_a(p_150893_1_, p_150893_2_) : this.efficiencyOnProperMaterial; } } Vous devriez plus avoir d'erreur dans votre classe Item.java et l'item devrez marché n'oubliez de mettre une texture pour faire plus jolie et mettre son nom dans le dossier lang en_US.lang. Passons au Spigot ! 1) Création de l'item dans Item.java (Coté Spigot) Pour la partie spigot je vais moins expliqué car c'est exactement le même principe que le client sauf que les noms des méthodes change... Tous d'abord comme dans notre client nous devons répertorié notre futur item dans Item.java et Items.java. Voilà à quoi sa devrais ressemblé dans Item.java : REGISTRY.a(ID, "Nom de l'item", new Paxel(Item.ToolMaterial.NIVEAUDEMATERIAL).c("Nom de l'item").f("Nom de l'item")); Logiquement vous devriez avoir une erreur car la classe Paxel n'est pas encore créer donc si vous avez une erreur c'est totalement normal.. Et dans Items.java sa devrais ressemblé à sa : public static final Item NomItem = (Item)Item.REGISTRY.get("Nom de l'item"); Voilà si vous avez fais sa pour le reste vous devriez vous en sortir ;) Passons à la créations de la classe Paxel 2) Création de la classe Paxel.java (Coté Spigot) Vu que je vous ai déjà tous expliqué dans la partie Client je vais direct vous donnez le code à mettre sans trop d'explication! Comme je vous ai dit précédemment il y a une méthode qui retourne vrai ou faux si il doit droppé l'item si il a une pioche quelconque et une autres méthodes qui change l’efficacité pour certain Blocks. Voilà donc ce qui y'a a mettre dans la classe Paxel dans le spigot : package net.minecraft.server; import java.util.Set; import com.google.common.collect.Sets; public class Paxel extends ItemTool{ private static final Set c = Sets.newHashSet(new Block[] { Blocks.COBBLESTONE, Blocks.DOUBLE_STEP, Blocks.STEP, Blocks.STONE, Blocks.SANDSTONE, Blocks.MOSSY_COBBLESTONE, Blocks.IRON_ORE, Blocks.IRON_BLOCK, Blocks.COAL_ORE, Blocks.GOLD_BLOCK, Blocks.GOLD_ORE, Blocks.DIAMOND_ORE, Blocks.DIAMOND_BLOCK, Blocks.ICE, Blocks.NETHERRACK, Blocks.LAPIS_ORE, Blocks.LAPIS_BLOCK, Blocks.REDSTONE_ORE, Blocks.GLOWING_REDSTONE_ORE, Blocks.RAILS, Blocks.DETECTOR_RAIL, Blocks.GOLDEN_RAIL, Blocks.ACTIVATOR_RAIL, Blocks.WOOD, Blocks.BOOKSHELF, Blocks.LOG, Blocks.LOG2, Blocks.CHEST, Blocks.PUMPKIN, Blocks.JACK_O_LANTERN, Blocks.GRASS, Blocks.DIRT, Blocks.SAND, Blocks.GRAVEL, Blocks.SNOW, Blocks.SNOW_BLOCK, Blocks.CLAY, Blocks.SOIL, Blocks.SOUL_SAND, Blocks.MYCEL}); protected Paxel(EnumToolMaterial arg1) { super(3.0F, arg1, c); } public boolean canDestroySpecialBlock(Block paramBlock) { if (paramBlock == Blocks.OBSIDIAN) { return this.b.d() == 3; } if ((paramBlock == Blocks.DIAMOND_BLOCK) || (paramBlock == Blocks.DIAMOND_ORE)) { return this.b.d() >= 2; } if ((paramBlock == Blocks.EMERALD_ORE) || (paramBlock == Blocks.EMERALD_BLOCK)) { return this.b.d() >= 2; } if ((paramBlock == Blocks.GOLD_BLOCK) || (paramBlock == Blocks.GOLD_ORE)) { return this.b.d() >= 2; } if ((paramBlock == Blocks.IRON_BLOCK) || (paramBlock == Blocks.IRON_ORE)) { return this.b.d() >= 1; } if ((paramBlock == Blocks.LAPIS_BLOCK) || (paramBlock == Blocks.LAPIS_ORE)) { return this.b.d() >= 1; } if ((paramBlock == Blocks.REDSTONE_ORE) || (paramBlock == Blocks.GLOWING_REDSTONE_ORE)) { return this.b.d() >= 2; } if (paramBlock.getMaterial() == Material.STONE) { return true; } if (paramBlock.getMaterial() == Material.ORE) { return true; } if (paramBlock.getMaterial() == Material.HEAVY) { return true; } if (paramBlock == Blocks.SNOW) { return true; } if (paramBlock == Blocks.SNOW_BLOCK) { return true; } return false; } public float getDestroySpeed(ItemStack paramItemStack, Block paramBlock) { if ((paramBlock.getMaterial() == Material.ORE) || (paramBlock.getMaterial() == Material.HEAVY) || (paramBlock.getMaterial() == Material.STONE || paramBlock.getMaterial() == Material.WOOD) || (paramBlock.getMaterial() == Material.PLANT) || (paramBlock.getMaterial() == Material.REPLACEABLE_PLANT)) { return this.a; } return super.getDestroySpeed(paramItemStack, paramBlock); } } Et voilà nous avons maintenant l'item du coté spigot et client vous avez désormais votre PAXEL ! N'oubliez pas que le but n'est pas de recopier bêtement les codes le but est tous simplement de quand même comprendre pourquoi c'est fait comme sa ! Merci d'avoir lu mon post ! a+
  8. Vanilla

    Esque vous vouliez toujours avoir un bloc comme un trampoline ? alors ce tuto est fais pour vous Un Bloc sauteur ! -[iNTRODUCTION]- Bonjour à tous ! Dans ce tutoriel, nous allons faire un bloc qui vous fais sauter ! -[sOMMAIRE]- 1]Création du Bloc 2]Création du BlocSauteur.java 3]CraftBukkit 1]Création du Bloc Bon pour crée un bloc on fais comme d'habitude ce n'est pas nouveau il suffis de mettre dans Block et Blocks : Block.java blockRegistry.addObject(ID, "NOM_DU_BLOC", (new BlockSauteur()).setHardness(1.0F).setStepSound(SON).setBlockName("NOM_DU_BLOC").setBlockTextureName("TEXTURE_DU_BLOC")); Blocks.java public static final Block NOM_DU_BLOC = (Block)Block.blockRegistry.getObject("NOM_DU_BLOC"); 2]Création du BlockSauteur.java Ici on va faire le BlockSauteur.java pour que le joueur sois vachement plus rapide quand il marche sur se Bloc pour ça on va commencer par crée notre class sans rien dessus : package votre_package; public class BlockSauteur{ } ensuite on va déja rajouter un extends du Block.java,mettre un nouveau public ou on va rajouter un material et un emplacement dans le creativetab qui sera celui des Blocs package votre_package; import net.minecraft.block.Block;import net.minecraft.block.material.Material; import net.minecraft.creativetab.CreativeTabs; public class BlockSauteur extends Block { public BlockSauteur() { super(Material.rock); this.setCreativeTab(CreativeTabs.tabBlock); //creative tab, on met le bloc dans l'onglet bloc du creatif } } Maintenant il faut ajouter certaine fonction par exemple pour entrer en contact avec le bloc pour qu'il nous fasse sauter. Nous somme obligé mettre minimum 1 pixel pour entrer dedans voici comment on fais : public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1, int par2, int par3, int par4) { return AxisAlignedBB.getBoundingBox((double)par2, (double)par3, (double)par4, (double)(par2 + 1), (double)((float)(par3 + 1) - 0.125F), (double)(par4 + 1)); //ici on dit que on peu se faire aspirer de 1 pixel par le bloc } et ensuite il suffis de mettre le saut : public void onEntityCollidedWithBlock(World par1, int par2, int par3, int par4, Entity par5) { par5.motionY += 2D; } Alors là on peu remarqué que le joueur saute que si on saute sur le bloc se que nous ne voulons pas alors nous alons rajouter cette ligne par5. par5.ticksExisted = 10; //tout les 10 ticks il saute maintenant ça saute tout le temps mais on perd des dégâts de chute donc on va éviter ça on ajoute : par5.fallDistance *= 0D; // on perd 0 dégats de chute en retombant sur le bloc maintenant si on veut rajouter un bruit de piston : par1.playSoundAtEntity(par5, "tile.piston.in", 1.0F, 1.0F); // bruit de piston joué a l'entity se trouvant a proximité a présent notre bloc est bon mais vous allez me dire comment on fais pour sortir du bloc sans perdre des dégats de chute c'est très simple nous alons entrer un "if" if(par5.onGround && par5.isSneaking()) // si le joueur sneak sur le sol alors { par5.motionY += 0; // fais sauter le joueur a 0 bloc de haut par5.fallDistance += 0D; // on perd 0 dégats de chute en retombant sur le bloc } else //sinon { par5.ticksExisted = 10; par5.motionY += 2D; fais sauter le joueur par1.playSoundAtEntity(par5, "tile.piston.in", 1.0F, 1.0F); // bruit de piston joué a l'entity se trouvant a proximité par5.fallDistance += 0D; // on perd 0 dégats de chute en retombant sur le bloc } se qui nous donne au final : package votre_package; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.Minecraft; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.MovementInput; import net.minecraft.world.World; public class BlockSauteur extends Block { public BlockSauteur() { super(Material.rock); this.setCreativeTab(CreativeTabs.tabBlock); } public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1, int par2, int par3, int par4) { return AxisAlignedBB.getBoundingBox((double)par2, (double)par3, (double)par4, (double)(par2 + 1), (double)((float)(par3 + 1) - 0.125F), (double)(par4 + 1)); } public void onEntityCollidedWithBlock(World par1, int par2, int par3, int par4, Entity par5) { if(par5.isSneaking()) // si le joueur sneak alors { par5.motionY += 0; // fais sauter le joueur a 0 bloc de haut par5.fallDistance += 0D; // on perd 0 dégats de chute en retombant sur le bloc } else //sinon { par5.ticksExisted = 10; par5.motionY += 2D; fais sauter le joueur par1.playSoundAtEntity(par5, "tile.piston.in", 1.0F, 1.0F); // bruit de piston joué a l'entity se trouvant a proximité par5.fallDistance += 0D; // on perd 0 dégats de chute en retombant sur le bloc } } } 3]CraftBukkit pour craftbukkit je vous donne tout c'est la même chose Block.java REGISTRY.a(ID, "NOM_DU_BLOC", (new BlockSauteur()).c(1.0F).a(k).c("NOM_DU_BLOC").d("TEXTURE_DU_BLOC")); Blocks.java public static final Block NOM_DU_BLOC = (Block) Block.REGISTRY.a("NOM_DU_BLOC"); et enfin le BlockSauteur.java (1.7.2) package net.minecraft.server; import net.minecraft.server.AxisAlignedBB; import net.minecraft.server.Block; import net.minecraft.server.CreativeModeTab; import net.minecraft.server.Entity; import net.minecraft.server.Material; import net.minecraft.server.World; public class BlockSauteur extends Block { public BlockSauteur() { super(Material.STONE); this.a(CreativeModeTab.; } public AxisAlignedBB a(World world, int i, int j, int k) { return AxisAlignedBB.a().a((double) i, (double) j, (double) k, (double) (i + 1), (double) ((float) (j + 1) - (float) 0.125F), (double) (k + 1)); } public void a(World world, int i, int j, int k, Entity entity) { if(entity.isSneaking()) { entity.motY += 0D; // on fais sauter le joueur entity.fallDistance += 0D; // on perd 0 dégâts de chute } else { entity.motY += 2D; // on fais sauter le joueur entity.fallDistance += 0D; // on perd 0 dégâts de chute entity.ticksLived = 10; // on saute tout les 10 ticks } } } BlockSauteur.java (1.7.10) package net.minecraft.server; import net.minecraft.server.AxisAlignedBB; import net.minecraft.server.Block; import net.minecraft.server.CreativeModeTab; import net.minecraft.server.Entity; import net.minecraft.server.Material; import net.minecraft.server.World; public class BlockSauteur extends Block { public BlockSauteur() { super(Material.STONE); this.a(CreativeModeTab.; } public AxisAlignedBB a(World world, int i, int j, int k) { float f = 0.125F; return AxisAlignedBB.a((double) i, (double) j, (double) k, (double) (i + 1), (double) ((float) (j + 1) - f), (double) (k + 1)); } public void a(World world, int i, int j, int k, Entity entity) { if(entity.isSneaking()) { entity.motY += 0D; // on fais sauter le joueur entity.fallDistance += 0D; // on perd 0 dégâts de chute } else { entity.motY += 2D; // on fais sauter le joueur entity.fallDistance += 0D; // on perd 0 dégâts de chute entity.ticksLived = 10; // on saute tout les 10 ticks } } } Et voilà j'espère que ça vous a plus bon jeu avec votre nouveau bloc
  9. Vanilla

    Hache de Combat -[iNTRODUCTION]- Bonjour à tous ! Dans ce tutoriel, nous allons faire une une hache de combat -[sOMMAIRE]- 1]Création de l'item 2]Création du ItemHacheDeCombat.java 3]Création du EnumHacheDeCombat 3]CraftBukkit 1]Création de l'item la création d'un item c'est pas quelque chose de compliqué il suffis de faire comme ceci : Item.java itemRegistry.addObject(ID, "NOM", (new ItemHacheDeCombat(Item.EnumHacheDeCombat.DIAMOND)).setUnlocalizedName("NOM").setTextureName("NOM_TEXTURE"))); il y a une erreur c'est normal pour le moment Items.java public static final Item NOM = (Item)Item.itemRegistry.getObject("NOM"); 2] Création du ItemHacheDeCombat.java donc comme je fais toujours on part de rien d'un class comme ceci : package votre_package; public class ItemHacheDeCombat { } donc ici on va tout de suite faire un extends de Item, ajouter un public qui va nous diriger vers notre enum un maxStackSize, déclarer notre enum et une durabilité qui sera dans notre enum : package votre_package; public class ItemHacheDeCombat extends Item { private float field_150934_a; private final EnumHacheDeCombat field_150933_b; public ItemHacheDeCombat(Item.EnumHacheDeCombat par1) { this.field_150933_b = par1; // déclaration du enum this.maxStackSize = 1; // stackable pas 1 this.setMaxDamage(par1.getMaxUses()); // durabilité se trouvant dans notre enum this.setCreativeTab(CreativeTabs.tabCombat); // on met notre hache dans le tab Combat du créatif this.field_150934_a = 4.0F + par1.getDamageVsEntity(); } } erreur pour le momentr c'est totalement normal maintenant on va crée quelque public comme l'enchante, une autre déclaration de l'enum si il est réparrable le maxITemUseDuration si l'item est en 3D, quand on casse un bloc si retire de la durabilité parreil pour les entité et faire en sorte que ça casse du bois comme une hache : public float func_150931_i() { return this.field_150933_b.getDamageVsEntity(); // l'item est fais pour tapé des entité } public float func_150893_a(ItemStack par1, Block par2) { Material var3 = par2.getMaterial(); return var3 != Material.wood && var3 != Material.plants && var3 != Material.vine && var3 != Material.field_151572_C ? 1.0F : 1.5F; // l'item peu cassé du bois comme une hache } public boolean hitEntity(ItemStack par1ItemStack, EntityLivingBase par2EntityLivingBase, EntityLivingBase par3EntityLivingBase) // si on tape une entité l'item perd de la durabilité { par1ItemStack.damageItem(1, par3EntityLivingBase); return true; } public boolean onBlockDestroyed(ItemStack par1, World par2, Block par3, int par4, int par5, int par6, EntityLivingBase par7) // si on casse un bloc avec l'item perd de la durabilité { if ((double)par3.getBlockHardness(par2, par4, par5, par6) != 0.0D) { par1.damageItem(2, par7); } return true; } public boolean isFull3D() { return true; } public int getMaxItemUseDuration(ItemStack par1ItemStack) { return 72000; } public int getItemEnchantability() { return this.field_150933_b.getEnchantability(); // l'item est enchantable } public String func_150932_j() { return this.field_150933_b.toString(); // déclaration de notre enum que on fera apres } public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack) { return this.field_150933_b.func_150995_f() == par2ItemStack.getItem() ? true : super.getIsRepairable(par1ItemStack, par2ItemStack); // l'item est réparrable } public Multimap getItemAttributeModifiers() { Multimap var1 = super.getItemAttributeModifiers(); var1.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(field_111210_e, "Weapon modifier", (double)this.field_150934_a, 0)); return var1; } ce qui nous donne au final : package votre_package; import com.google.common.collect.Multimap; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.attributes.AttributeModifier; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.item.EnumAction; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.world.World; public class ItemHacheDeCombat extends Item { private float field_150934_a; private final EnumHacheDeCombat field_150933_b; public ItemHacheDeCombat(Item.EnumHacheDeCombat par1) { this.field_150933_b = par1; this.maxStackSize = 1; this.setMaxDamage(par1.getMaxUses()); this.setCreativeTab(CreativeTabs.tabCombat); this.field_150934_a = 4.0F + par1.getDamageVsEntity(); } public float func_150931_i() { return this.field_150933_b.getDamageVsEntity(); } public float func_150893_a(ItemStack par1, Block par2) { Material var3 = par2.getMaterial(); return var3 != Material.wood && var3 != Material.plants && var3 != Material.vine && var3 != Material.field_151572_C ? 1.0F : 1.5F; } public boolean hitEntity(ItemStack par1ItemStack, EntityLivingBase par2EntityLivingBase, EntityLivingBase par3EntityLivingBase) { par1ItemStack.damageItem(1, par3EntityLivingBase); return true; } public boolean onBlockDestroyed(ItemStack par1, World par2, Block par3, int par4, int par5, int par6, EntityLivingBase par7) { if ((double)par3.getBlockHardness(par2, par4, par5, par6) != 0.0D) { par1.damageItem(2, par7); } return true; } public boolean isFull3D() { return true; } public int getMaxItemUseDuration(ItemStack par1ItemStack) { return 72000; } public int getItemEnchantability() { return this.field_150933_b.getEnchantability(); } public String func_150932_j() { return this.field_150933_b.toString(); } public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack) { return this.field_150933_b.func_150995_f() == par2ItemStack.getItem() ? true : super.getIsRepairable(par1ItemStack, par2ItemStack); } public Multimap getItemAttributeModifiers() { Multimap var1 = super.getItemAttributeModifiers(); var1.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(field_111210_e, "Weapon modifier", (double)this.field_150934_a, 0)); return var1; } } 3] Création du EnumHacheDeCombat (dans Item.java pour client) donc pour le client l'enum se trouve dans Item tout en bas pour les outils et épée nous allons en crée une donc il suffis de copier et de coller voilà : public static enum EnumHacheDeCombat { WOOD("WOOD", 0, 0, 59, 3.0F, 0.0F, 15), STONE("STONE", 1, 1, 131, 5.0F, 1.0F, 5), IRON("IRON", 2, 2, 250, 7.0F, 2.0F, 14), DIAMOND("DIAMOND", 3, 3, 1561, 8.0F, 2.5F, 10), GOLD("GOLD", 4, 0, 32, 12.0F, 0.0F, 22); private final int harvestLevel; private final int maxUses; private final float efficiencyOnProperMaterial; private final float damageVsEntity; private final int enchantability; private static final Item.EnumHacheDeCombat[] $VALUES = new Item.EnumHacheDeCombat[]{WOOD, STONE, IRON, DIAMOND, GOLD}; private static final String __OBFID = "CL_00000042"; private EnumHacheDeCombat(String par1Str, int par2, int par3, int par4, float par5, float par6, int par7) { this.harvestLevel = par3; this.maxUses = par4; this.efficiencyOnProperMaterial = par5; this.damageVsEntity = par6; this.enchantability = par7; } public int getMaxUses() { return this.maxUses; } public float getEfficiencyOnProperMaterial() { return this.efficiencyOnProperMaterial; } public float getDamageVsEntity() { return this.damageVsEntity; } public int getHarvestLevel() { return this.harvestLevel; } public int getEnchantability() { return this.enchantability; } public Item func_150995_f() { return this == WOOD ? Item.getItemFromBlock(Blocks.planks) : (this == STONE ? Item.getItemFromBlock(Blocks.cobblestone) : (this == GOLD ? Items.gold_ingot : (this == IRON ? Items.iron_ingot : (this == DIAMOND ? Items.diamond : null)))); } } et normalement toutes les erreur devrai disparaître 4]CraftBukkit Item : REGISTRY.a(ID, "NOM", (new ItemHacheDeCombat(EnumHacheDeCombat.DIAMOND)).c("NOM").f("NOM_TEXTURE")); Items : public static final Item NOM = (Item)Item.REGISTRY.a("NOM"); ItemHacheDeCombat.java package net.minecraft.server; import net.minecraft.util.com.google.common.collect.Multimap; public class ItemHacheDeCombat extends Item { private float damage; private final EnumHacheDeCombat b; public ItemHacheDeCombat(EnumHacheDeCombat enumtoolmaterial) { this.b = enumtoolmaterial; this.maxStackSize = 1; this.setMaxDurability(enumtoolmaterial.a()); this.a(CreativeModeTab.j); this.damage = 4.0F + enumtoolmaterial.c(); } public float i() { return this.b.c(); } public float getDestroySpeed(ItemStack itemstack, Block block) { Material material = block.getMaterial(); return material != Material.WOOD && material != Material.PLANT && material != Material.REPLACEABLE_PLANT ? 1.0F : 1.5F; } public boolean a(ItemStack itemstack, EntityLiving entityliving, EntityLiving entityliving1) { itemstack.damage(1, entityliving1); return true; } public boolean a(ItemStack itemstack, World world, Block block, int i, int j, int k, EntityLiving entityliving) { if ((double) block.f(world, i, j, k) != 0.0D) { itemstack.damage(2, entityliving); } return true; } public int d_(ItemStack itemstack) { return 72000; } public int c() { return this.b.e(); } public String j() { return this.b.toString(); } public boolean a(ItemStack itemstack, ItemStack itemstack1) { return this.b.f() == itemstack1.getItem() ? true : super.a(itemstack, itemstack1); } public Multimap k() { Multimap multimap = super.k(); multimap.put(GenericAttributes.e.a(), new AttributeModifier(f, "Weapon modifier", (double) this.damage, 0)); return multimap; } } EnumHacheDeCombat.java package net.minecraft.server; public enum EnumHacheDeCombat { WOOD("WOOD", 0, 0, 59, 3.0F, 0.0F, 15), STONE("STONE", 1, 1, 131, 5.0F, 1.0F, 5), IRON("IRON", 2, 2, 250, 7.0F, 2.0F, 14), DIAMOND("DIAMOND", 3, 3, 1561, 8.0F, 2.5F, 10), GOLD("GOLD", 4, 0, 32, 12.0F, 0.0F, 22); private final int f; private final int g; private final float h; private final float i; private final int j; private static final EnumHacheDeCombat[] k = new EnumHacheDeCombat[] { WOOD, STONE, IRON, DIAMOND, GOLD}; private EnumHacheDeCombat(String s, int i, int j, int k, float f, float f1, int l) { this.f = j; this.g = k; this.h = f; this.i = f1; this.j = l; } public int a() { return this.g; } public float b() { return this.h; } public float c() { return this.i; } public int d() { return this.f; } public int e() { return this.j; } public Item f() { return this == WOOD ? Item.getItemOf(Blocks.WOOD) : (this == STONE ? Item.getItemOf(Blocks.COBBLESTONE) : (this == GOLD ? Items.GOLD_INGOT : (this == IRON ? Items.IRON_INGOT : (this == DIAMOND ? Items.DIAMOND : null)))); } } voilà bon jeu avec vos haches de combats
  10. 1.7.x

    Tout sur les blocs ! Cette uvre est mise à disposition selon les termes de la Licence Creative Commons Attribution - Pas dUtilisation Commerciale - Pas de Modification 3.0 non transposé . Tout partage implique que vous citiez l'auteur original. -[iNTRODUCTION]- Bonjour à tous ! Dans ce tutoriel, nous allons explorer les méandres des objets les plus importants dans Minecraft : les blocs ! -[sOMMAIRE]- 1] Mais au fait, c'est quoi un bloc ? 2] Bases du système 3] Créer un bloc A] Un bloc simple B] Les textures et les noms C] Les méta-données D] Quelques méthodes utiles E] Ajouter un bloc avec un rendu complexe 4] Astuces pratiques A] Créer un minerai B] Créer un bloc orientable C] Créer une plante D] Créer un onglet dans le menu créatif E] La génération 5] Entités de blocs (TileEntities) 6]Astuces pratique 2 A]Créer une nouvelle table de craft B]Créer un four C]Créer un coffre 1] Mais au fait, c'est quoi un bloc ? Cette méthode statique est appelé lors du lancement du client Minecraft (depuis le constructeur Minecraft() Bootstrap.func_151354_b()). C'est ici que sont instanciés tous les blocs. Et pour répondre à notre question de départ, on pourra dire simplement qu'un bloc est une instance de la classe Block (captain obvious). 2] Bases du système C'est donc depuis cette classe (grâce au modifieur public), que nous pourrons récupérer les instances de nos blocs précédemment déclarés dans Block. Comme nous l'avons dit précédemment, un bloc est une instance d'une classe fille de Block. Si vous vous rendez dans cette dernière, vous y verrez beaucoup de méthodes, pour la plupart vide. La majorité d'entre elles correpond à des évenements qui surviennent en jeu (quand un joueur casse un, qu'il marche dessus, qu'il clique dessus, etc.). Nous reviendrons plus en détails sur ces méthodes dans la partie 3C. Chaque bloc a donc sa propre classe, et ce pour permettre un paramétrage fin. En résumé, les redéfinitions de méthodes (overrides) sont le nerf de la guerre pour créer des blocs ! 3] Créer un bloc A] Un bloc simple B] Les textures et les noms C] Les méta-données D] Quelques méthodes utiles E] Ajouter un bloc avec un rendu complexe 4] Astuces pratiques Nous voilà maintenant arrivés à la partie que je pense que vous attendiez le plus ! Avant de rentrer dans le vif du sujet, je voudrais quand même préciser quelque chose : libre à vous de copier « brutalement » les codes présentés ici sans aucunement chercher la compréhension, mais je vous conseille d'abord de lire ce qui a été dit au dessus. A] Créer un minerai B] Créer un bloc orientable C] Créer une plante Bientôt... E] La génération 5] Entités de blocs (TileEntities) Par défaut, un bloc de monde n'est pas une entité, en ce sens qu'il ne dispose pas des fonctionnalités utiles de celles, comme par exemple la sauvegarde d'informations spécifiques via NBT. Mais certains blocs aux fonctionnalités particulières on besoin de ces fonctionnalités, comme par exemple les coffres ou les dispensers. Alors, quand on les pose dans un monde, il ne sont plus « seulement » des cubes, mais aussi des entités qui intéragissent avec leur environnement. Voyons comment créer ça ! A] Créer une TileEntity B] Les méthodes disponibles C] Lui attribuer un rendu spécial
  11. Créer un écran de chargement -[INTRODUCTION]- Bonjour à tous ! Dans ce tutoriel, nous allons faire un écran de chargement ! Je me permet de refaire le tutoriel, car l'autre à était modifier.. -[SOMMAIRE]- 1]Création du "GuiLoadingScreen 2]Création de l'écran 3]GuiMainMenu 1]Création du GuiLoadingScreen ! Il vous suffit de vous rendre dans le packages : net.minecraft.client.gui, puis créer une nouvelle class "GuiLoadingScreen" ! 2]Créer l'écran de chargement ! package net.minecraft.client.gui; import java.util.List; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.GuiConnecting; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.texture.TextureManager; import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL11; public class GuiLoadingScreen extends GuiScreen { private final ResourceLocation backGround = new ResourceLocation("textures/gui/title/chargement.png"); // Chargement = Nom de votre image private int updateCounter = 0; String chargementText = "§6Chargement§f de la porte ..."; // A vous de mettre ce que vous voulez ! String serverName = "§6Nom"; // A vous de mettre ce que vous voulez ! String texteHaut = "§6Connexion§7 au serveur ! ..."; // A vous de mettre ce que vous voulez ! String bfsName = "§7Serveur: Faction"; // A vous de mettre ce que vous voulez ! public void initGui() { this.buttonList.add(new GuiButton(9, this.width - 100, this.height - 30, 60, 20, "Annuler")); } public void updateScreen() { this.updateCounter += 1; if (this.updateCounter == 100) { this.mc.displayGuiScreen(new GuiConnecting(this, this.mc, "IP", PORT)); // Ip = L'ip du serveur ! Port = Port du serveur. } if (this.updateCounter >= 101) { this.mc.displayGuiScreen(new GuiMainMenu()); } } public void drawBack() { GL11.glViewport(0, 0, 256, 256); this.mc.getTextureManager().bindTexture(this.backGround); GL11.glViewport(0, 0, this.mc.displayWidth, this.mc.displayHeight); Tessellator tessellator = Tessellator.instance; tessellator.startDrawingQuads(); GL11.glTexParameteri(3553, 10241, 9729); GL11.glTexParameteri(3553, 10240, 9729); tessellator.setColorRGBA_F(1.0F, 1.0F, 1.0F, 1.0F); int k = this.width; int l = this.height; tessellator.addVertexWithUV(0.0D, 0.0D, this.zLevel, 0.0D, 0.0D); tessellator.addVertexWithUV(0.0D, l, this.zLevel, 0.0D, 1.0D); tessellator.addVertexWithUV(k, l, this.zLevel, 1.0D, 1.0D); tessellator.addVertexWithUV(k, 0.0D, this.zLevel, 1.0D, 0.0D); tessellator.draw(); } public void drawScreen(int par1, int par2, float par3) { drawBack(); drawHorizontalLine(0, this.width, this.height - 47, 1426063360); drawHorizontalLine(0, this.width, this.height - 46, 1426063360); drawRect(0, this.height - 45, this.width, this.height, 1426063360); drawRect(this.width / 2 - 101, this.height - 28, this.width / 2 + 101, this.height - 15, 489386); drawRect(this.width / 2 - 100, this.height - 27, this.width / 2 + 100, this.height - 16, 2013243904); drawRect(this.width / 2 - 100, this.height - 27, this.width / 2 - 100 + this.updateCounter * 2, this.height - 16, -1996510720); drawCenteredString(this.fontRendererObj, this.chargementText, this.width / 2, this.height - 40, 16777215); String percent = this.updateCounter + "§6%"; drawCenteredString(this.fontRendererObj, percent, this.width / 2, this.height - 10, 16777215); drawCenteredString(this.fontRendererObj, this.texteHaut, this.width / 2, 1, -1); drawString(this.fontRendererObj, this.bfsName, 10, this.height - 30, -1); drawString(this.fontRendererObj, this.serverName, 10, this.height - 19, -1); super.drawScreen(par1, par2, par3); } public void actionPerformed(GuiButton button) { if (button.id == 9) { this.mc.displayGuiScreen(new GuiMainMenu()); } } } 3]GuiMainMenu Rendez-vous dans le GuiMainMenu plus précisément ici : En desous de cet ligne de code : Vous allez ajouter ça : if (p_146284_1_.id == 9) { this.mc.displayGuiScreen(new GuiLoadingScreen()); }
  12. vous avez toujours eu envis d'un bâton/sceptre de soin ? et bien se tuto est fait pour vous Bâton/Sceptre de Soin -[iNTRODUCTION]- Bonjour à tous ! Dans ce tutoriel, nous allons faire un Bâton/Sceptre de soin -[sOMMAIRE]- 1]Création de l'item 2]Création du BatonDeSoin.java 3]CraftBukkit 1]Création de l'item la création d'un item c'est pas quelque chose de compliqué il suffis de faire comme ceci : Item.java itemRegistry.addObject(ID, "NOM", (new BatonDeSoin().setUnlocalizedName("NOM").setTextureName("NOM_TEXTURE"))); Items.java public static final Item NOM = (Item)Item.itemRegistry.getObject("NOM"); 2] Création du BatonDeSoin.java alors ici on va commencer par crée notre class normalement vous aurez ceci : package votre_package; public class BatonDeSoin { } alors tout de suite nous alons faire un extends sur Item et donc ajouter un maxStackSize une Durabilité et un emplacement dans le créatif : package votre_package; public class BatonDeSoin extends Item { public BatonDeSoin() { this.maxStackSize = 1; // on lui met un stack de 1 this.setMaxDamage(15); // on met 15 de durabilité this.setCreativeTab(CreativeTabs.tabCombat); // on le met dans le tab Combat du créatif } } une fois ça fais nous allons ajouter une fonction que quand on fais click droit ça fais une action : public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) { return par1ItemStack; } dans cette fonction nous alons ajouter un effect de potion qui est le heal et on va aussi déclarer la durabilité : public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) { par1ItemStack.damageItem(1, par3EntityPlayer); // on déclare la durabilité par3EntityPlayer.addPotionEffect(new PotionEffect(Potion.heal.id, 1, 0)); // on met un effet de heal 1 pendant 1 tick return par1ItemStack; } et puis on rajoute de la 3D : public boolean isFull3D() // on met de la 3D a l'item { return true; } ce qui nous donne au final : package votre_package; public class BatonDeSoin extends Item{ public BatonDeSoin() { this.maxStackSize = 1; this.setMaxDamage(10); this.setCreativeTab(CreativeTabs.tabCombat); } public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) { par1ItemStack.damageItem(1, par3EntityPlayer); par3EntityPlayer.addPotionEffect(new PotionEffect(Potion.heal.id, 1, 0)); return par1ItemStack; } } et voilà passons au craftbukkit qui est la même chose 3] CraftBukkit Item.java REGISTRY.a(ID, "NOM", (new BatonDeSoin()).c("NOM").f("NOM_TEXTURE")); Items.java (Pour 1.7.2) public static final Item NOM = (Item)Item.REGISTRY.a("NOM"); Items.java (Pour 1.7.10) public static final Item NOM = (Item)Item.REGISTRY.get("NOM"); BatonDeSoin.java package net.minecraft.server; import net.minecraft.server.EntityHuman; import net.minecraft.server.Item; import net.minecraft.server.ItemStack; import net.minecraft.server.MobEffect; import net.minecraft.server.MobEffectList; import net.minecraft.server.World; public class BatonDeSoin extends Item { public BatonDeSoin() { this.maxStackSize = 1; this.setMaxDurability(15); } public ItemStack a(ItemStack itemstack, World world, EntityHuman entityhuman) { entityhuman.addEffect(new MobEffect(MobEffectList.HEAL.id, 1, 0)); itemstack.damage(1, entityhuman); return itemstack; } } et voilà bon jeu avec votre bâton de soin
  13. Bonjour je vais mettre ce tutos en videos et en texte : VIDEO : https://www.youtube.com/watch?v=SizqLNqbpS0 TEXTE : PAS ENCORE DISPONIBLE
  14. Item qui fait spawn un mob en Vanilla -[iNTRODUCTION]- Bonjour à tous ! Dans ce tutoriel, nous allons faire un Item qui fait spawn un mob, commençons sans attendre -[sOMMAIRE]- 1]Création d'un classe ordinaire 2]Création d'une méthode onItemUse 3]Faire spawner le mob 4] Craftbukkit 1]Création d'une classe ordinaire Commençons par créer une class ordinaire. package fr.tonnom.tonmod; public class ItemMob { public ItemMob() { } } Puis nous allons ajouter le stack maximum (pour moi ce sera 1), sa durabilité (pour moi ce sera 5) et l'emplacement dans l'inventaire creatif. Nous allons donc ajouter ces deux lignes : this.setCreativeTab(CreativeTabs.tabMisc); this.setMaxDamage(5); this.setMaxStackSize(1); dans le " public void ItemMob() " 2] Création d'une méthodeonItemUse Commençons par créer notre méthode en boolean, qui va s'éxécuter lors de l'utilisation de l'item. public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10) return true; } Ensuite ajoutons-y ce qu'il nous faut, c'est à dire récupérer les informations du bloc clicker public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10) { par1ItemStack.damageItem(1, par2EntityPlayer); // ici nous faisons en sorte que la durabilité baisse de 1 après un click droit if (par3World.isClient) // si le mon est Client alors... { return true; // ... ça renvoi true ... } else // ... sinon ... { Block var11 = par3World.getBlock(par4, par5, par6); // on récupère le bloc par4 += Facing.offsetsXForSide[par7]; // ------ par5 += Facing.offsetsYForSide[par7]; // | -- on récupère les coordonnées par6 += Facing.offsetsZForSide[par7]; //------- double var12 = 0.0D; if (par7 == 1 && var11.getRenderType() == 11) { var12 = 0.5D; } Entity var14 = spawnCreature(par3World, 2, (double)par4 + 0.5D, (double)par5 + var12, (double)par6 + 0.5D); if (var14 != null) { if (var14 instanceof EntityLivingBase && par1ItemStack.hasDisplayName()) { ((EntityLiving)var14).setCustomNameTag(par1ItemStack.getDisplayName()); } } return true; } } 3] Faire spawner le mob Ici nous allons créér notre méthode " spawnCreature "en static public static Entity spawnCreature(World par0World, int par1, double par2, double par4, double par6) { } Puis nous allons mettre tout ce qu'il nous faut à lintérieur, c'est à dire la récupération du mob. public static Entity spawnCreature(World par0World, int par1, double par2, double par4, double par6) { Entity var8 = null; for (int var9 = 0; var9 < 1; ++var9) // nous créons une boucle " for " { var8 = EntityList.createEntityByID(50, par0World); // ici nous allons faire spawner un creeper qui a l'id " 50 " donc nous récupérons le mob. if (var8 != null && var8 instanceof EntityLivingBase) // donc si le mob n'est pas = à null et qu'il instance bien EntityLivingBase alors ... { EntityLiving var10 = (EntityLiving)var8; var8.setLocationAndAngles(par2, par4, par6, MathHelper.wrapAngleTo180_float(par0World.rand.nextFloat() * 360.0F), 0.0F); // --------------------------------- var10.rotationYawHead = var10.rotationYaw; // | // on défini les positions du mob. var10.renderYawOffset = var10.rotationYaw; //------------- var10.onSpawnWithEgg((IEntityLivingData)null); par0World.spawnEntityInWorld(var8); // on fait spawn l'entité var10.playLivingSound(); // on émet son bruit. } } return var8; } ce qui nous donne au final : package fr.tonnom.tonmod; public class ItemMob extends Item { public ItemMob() { this.setCreativeTab(CreativeTabs.tabMisc); this.setMaxDamage(5); this.setMaxStackSize(1); } public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10) { par1ItemStack.damageItem(1, par2EntityPlayer); if (par3World.isClient) { return true; } else { Block var11 = par3World.getBlock(par4, par5, par6); par4 += Facing.offsetsXForSide[par7]; par5 += Facing.offsetsYForSide[par7]; par6 += Facing.offsetsZForSide[par7]; double var12 = 0.0D; if (par7 == 1 && var11.getRenderType() == 11) { var12 = 0.5D; } Entity var14 = spawnCreature(par3World, 2, (double)par4 + 0.5D, (double)par5 + var12, (double)par6 + 0.5D); if (var14 != null) { if (var14 instanceof EntityLivingBase && par1ItemStack.hasDisplayName()) { ((EntityLiving)var14).setCustomNameTag(par1ItemStack.getDisplayName()); } } return true; } } public static Entity spawnCreature(World par0World, int par1, double par2, double par4, double par6) { Entity var8 = null; for (int var9 = 0; var9 < 1; ++var9) { var8 = EntityList.createEntityByID(50, par0World); if (var8 != null && var8 instanceof EntityLivingBase) { EntityLiving var10 = (EntityLiving)var8; var8.setLocationAndAngles(par2, par4, par6, MathHelper.wrapAngleTo180_float(par0World.rand.nextFloat() * 360.0F), 0.0F); var10.rotationYawHead = var10.rotationYaw; var10.renderYawOffset = var10.rotationYaw; var10.onSpawnWithEgg((IEntityLivingData)null); par0World.spawnEntityInWorld(var8); var10.playLivingSound(); } } return var8; } } 4] Craftbukkit Pour le craftbukkit c'est le même concept donc je vous donne le code directement : 1.7.2 : package net.minecraft.server; public class ItemMob extends Item { public ItemMob(){ this.maxStackSize = 1; this.setMaxDurability(5); } public boolean interactWith(ItemStack itemstack, EntityHuman entityhuman, World world, int i, int j, int k, int l, float f, float f1, float f2) { itemstack.damage(1, entityhuman); if (world.isStatic || itemstack.getData() == 48 || itemstack.getData() == 49 || itemstack.getData() == 63 || itemstack.getData() == 64) { return true; } else { Block block = world.getType(i, j, k); i += Facing.b[l]; j += Facing.c[l]; k += Facing.d[l]; double d0 = 0.0D; if (l == 1 && block.b() == 11) { d0 = 0.5D; } Entity entity = a(world, 2, (double) i + 0.5D, (double) j + d0, (double) k + 0.5D); if (entity != null) { if (entity instanceof EntityLiving && itemstack.hasName()) { ((EntityInsentient) entity).setCustomName(itemstack.getName()); } } return true; } } public static Entity a(World world, int i, double d0, double d1, double d2) { return spawnCreature(world, i, d0, d1, d2, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SPAWNER_EGG); } public static Entity spawnCreature(World world, int i, double d0, double d1, double d2, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason spawnReason) { Entity entity = null; for (int j = 0; j < 1; ++j) { entity = EntityTypes.a(50, world); if (entity != null && entity instanceof EntityLiving) { EntityInsentient entityinsentient = (EntityInsentient) entity; entity.setPositionRotation(d0, d1, d2, MathHelper.g(world.random.nextFloat() * 360.0F), 0.0F); entityinsentient.aO = entityinsentient.yaw; entityinsentient.aM = entityinsentient.yaw; entityinsentient.a((GroupDataEntity) null); world.addEntity(entity, spawnReason); entityinsentient.r(); } } return entity; } } 1.7.10 : package net.minecraft.server; public class ItemMob extends Item { public ItemMob(){ this.maxStackSize = 1; this.setMaxDurability(5); } public boolean interactWith(ItemStack itemstack, EntityHuman entityhuman, World world, int i, int j, int k, int l, float f, float f1, float f2) { itemstack.damage(1, entityhuman); if (world.isStatic || itemstack.getData() == 48 || itemstack.getData() == 49 || itemstack.getData() == 63 || itemstack.getData() == 64) { return true; } else { Block block = world.getType(i, j, k); i += Facing.b[l]; j += Facing.c[l]; k += Facing.d[l]; double d0 = 0.0D; if (l == 1 && block.b() == 11) { d0 = 0.5D; } Entity entity = a(world, 2, (double) i + 0.5D, (double) j + d0, (double) k + 0.5D); if (entity != null) { if (entity instanceof EntityLiving && itemstack.hasName()) { ((EntityInsentient) entity).setCustomName(itemstack.getName()); } } return true; } } public static Entity a(World world, int i, double d0, double d1, double d2) { return spawnCreature(world, i, d0, d1, d2, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SPAWNER_EGG); } public static Entity spawnCreature(World world, int i, double d0, double d1, double d2, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason spawnReason) { Entity entity = null; for (int j = 0; j < 1; ++j) { entity = EntityTypes.a(50, world); if (entity != null && entity instanceof EntityLiving) { EntityInsentient entityinsentient = (EntityInsentient) entity; entity.setPositionRotation(d0, d1, d2, MathHelper.g(world.random.nextFloat() * 360.0F), 0.0F); entityinsentient.aO = entityinsentient.yaw; entityinsentient.aM = entityinsentient.yaw; entityinsentient.prepare((GroupDataEntity) null); world.addEntity(entity, spawnReason); entityinsentient.r(); } } return entity; } } Et voilà merci d'avoir suivi ce tutoriel et je vous dit à bientôt ! 10/07/2015 21:24 Corrigé et mis en page par Zetsyog 11/07/2015 12:27 Fautes criminelles de convention corrigées par TheShark34
  15. Vanilla

    J'exposerai ici comment j'ai fait pour mon bloc anti-piston. J'ai vu cette demande dans la catégorie Support, et je trouvais utile de faire un tutoriel, plutôt que de déterrer d'anciens sujets à l'avenir. Créer un bloc anti-piston: Cette uvre est mise à disposition selon les termes de laLicence Creative Commons Attribution - Pas dUtilisation Commerciale - Pas de Modification 3.0 non transposé. Tout partage implique que vous citiez l'auteur original. Sommaire: 1]Préparatifs Pour commencer, il vous faudra un Minecraft décompilé en 1.6 - 1.7 (dans mon cas la 1.7.10) avec MCP(= Minecraft Coder Pack). 2]Mise en place du code On va commencer directement le tutoriel ! Préparez votre espace de travail en démarrant Eclipse avec la workspace habituelle. Une fois ceci fait, ouvrez les packages net.minecraft.block et net.minecraft.block.Material. Vous aurez besoin de deux classes: Block.java et Material.java Dans Block.java, vous devriez repérer ceci à la ligne 388. blockRegistry.addObject(175, "double_plant", new BlockDoublePlant()); Ajoutez ceci juste après, de façon à déclarer un nouveau bloc. blockRegistry.addObject(200, "antipiston_block", (new Block(Material.noPushBlock)).setHardness(5.0F).setResistance(10.0F).setStepSound(soundTypePiston).setBlockName("blockAntiPiston").setCreativeTab(CreativeTabs.tabBlock).setBlockTextureName("antipiston_block")); 200 correspond à l'ID, le String suivant correspond au nom du bloc. "new Block(Material.noPushBlock))" indique que le Block dépendra du Material défini. La suite de la ligne est basique, comme chaque bloc Minecraft. Après avoir rajouté cette ligne dans la classe, vous devriez obtenir une erreur sur le Material. C'est là que la classe ouverte tout à l'heure intervient ! Après cette la ligne ci dessous, rajoutez un nouveau Material, comme montré. public static final Material field_151597_y = (new MaterialLogic(MapColor.field_151666_j)).setReplaceable().setTranslucent().setRequiresTool().setNoPushMobility(); Ajoutez donc cette ligne ci. public static final Material noPushBlock = (new Material(MapColor.field_151665_m)).setRequiresTool().setImmovableMobility(); Grâce à ce nouveau Material, on indique que pour casser le bloc, il faudra des outils, et qu'on ne pourra pas bouger le bloc avec un piston. Vous pouvez dès à présent tester votre nouveau bloc ! N'hésitez pas à reporter des bugs si vous en avez. Le résultat en image:
  16. \--[iNTRODUCTION]--/ Bonjour Développeur ! Ce tutoriel va vous expliquer comment afficher le Pseudo du joueur dans un GUI, dans un message défilant, ou n'importe où ! \--[PR-REQUIS]--/ Ce tutoriel est compatible avec Minecraft 1.6 ou 1.7! \--[sOMMAIRE]--/ 1]Explications 2]Exemples 3]Effets secondaires 1]Explications Minecraft.getMinecraft().getSession().getUsername() Ce code permet de récupérer le pseudo du joueur depuis n'importe quel endroit du code. Vous pouvez l'ajouter dans un texte comme ceci par exemple : String monTexte = "Bienvenue, " + Minecraft.getMinecraft().getSession().getUsername(); 2]Exemples Nous allons maintenant le tester ! Rendons-nous dans la classe Minecraft.java qui se trouve dans le package net.minecraft.client. Puis, faîtes Ctrl + F (pour chercher quelque chose dans un fichier) et puis vous cherchez : Display.setTitle Vous devriez tomber sur quelque chose comme ça : Display.setTitle("Minecraft 1.7.0"); C'est la ligne définissant le titre de la fenêtre principale du jeu. Vous pouvez par exemple rajouter le pseudo : + Minecraft.getMinecraft().getSession().getUsername() Ce qui nous donne : Display.setTitle("Minecraft " + Minecraft.getMinecraft().getSession().getUsername()); Comme on se trouve directement dans la classe Minecraft, on peut épurer ce code en faisant : Display.setTitle("Minecraft " + this.session.getUsername()); Et voilà le résultat : Maintenant vous pouvez le reproduire sur les GUI par exemple ! 3]Effets secondaires Il n'y a pas d'effets secondaires, le pseudo qui est affiché CHANGE selon le joueur bien sur ! C'est tout pour cette astuce ! Merci de l'avoir lu ! Si vous avez besoin d'une autre astuce vous pouvez me faire part de votre idée dans les commentaires ! - DiaZ0te 03.06.2015 16:20 Corrigé et amélioré par TheShark34 -- Amélioré, mis en page et approuvé par Wytrem le 19.06.2015 à 14h55.
  17. Un bouton en guise de commande Cette uvre est mise à disposition selon les termes de la Licence Creative Commons Attribution - Pas dUtilisation Commerciale - Pas de Modification 3.0 non transposé . Tout partage implique que vous citiez l'auteur original. -[iNTRODUCTION]- Bonjour a tous, dans ce tutoriel, je vais vous expliquer comment créer un bouton et lui lier une commande. -[sOMMAIRE]- 1] Création du bouton 2] Lier la commande au bouton 1]Ajout dubouton. Nous allons déclarer leboutondans la classe GuiInGameMenu. public void initGui() { //Du code this.buttonList.add(new GuiButton(id, posX, posY, nom)); //Du code } Passons aux explications : ID(int)correspond à l'id du bouton (doit être unique). posX(int)correspond à la position en pixel à partir du bord gauche de lécran. posY(int)correspond à la position en pixel à partir du bord haut de lécran. nom(String)correspond au nom affiché dans le bouton. 2]lier la commande aubouton. Toujours dans le même fichier. protected void actionPerformed([...]) { //Du code switch([...]) { //Des cases //On en ajoute une a la fin : case 8: //Si c'est le nouveau bouton qui est utilisé. { mc.thePlayer.sendChatMessage(message); //permet d'envoyer un message ou une commande dans le chat. mc.displayguiScreen(vue); //Permet de changer de vue. } } } Passons aux explications : message(String)correspond au message que vous souhaitez entrer dans le chat. vue(GuiScreen)correspond à la vue que vous voulez afficher, null revient dans le jeu. Vous pouvez bien entendu rajouter des conditions, notamment pour vérifier si le joueur est en multijoueur ou non. this.mc.isSingleplayer() { //Code si Solo mc.thePlayer.sendChatMessage(message); } else { //Code si Multi mc.thePlayer.sendChatMessage(message); } mc.displayguiScreen(vue); voila pour ce petit tuto, merci d'avoir tout lu
  18. Le login caché Cette uvre est mise à disposition selon les termes de la Licence Creative Commons Attribution - Pas dUtilisation Commerciale - Pas de Modification 3.0 non transposé . Tout partage implique que vous citiez l'auteur original. -[iNTRODUCTION]- Salut tout le monde ! En ce moment, je vois encore des demande d'aide ou les personne demande comment cacher le "MDP" du joueur quand il se login. Ce tutoriel a pour but de vous expliquer comment cacher le login du joueur. Bonne lecture !!! -[sOMMAIRE]- A] Partie A : Cacher le login [A 1] Préparation A] Ajout du code dans GuiTextField.java B] Captures d'écrans A] Ajout du code dans GuiTextField.java Pour commencer, nous allons aller à la ligne +/- 460 dans la fonction drawTextBox en dessous de : int var9 = var7; nous allons ajouter un string nommé str4 comme ceci : String str4 =""; entre les guillemets (" ") nous allons mettre le message à afficher après le mot de passe du joueur. Exemple : ensuite, nous allons ajouter une condition avec un if : if(var4.startsWith("/login ") || var4.startsWith("/l ") || var4.startsWith("/reg ") || var4.startsWith("/register ")) { } cette condition dit que si le message (var4) commence par un /login , /l , /register, /reg; Alors, le code en dessous s'effectue dans cette confition, nous allons ajouter 2 string var (String var51 et String var61) String var51 = var4.substring(0, var4.indexOf(" ")); String var61 = var4.substring(var4.indexOf(" ") + 1); var7 = 0; Le string var met un espace ( ) après le mot de passe du joueur. ensuite, nous allons créer plusieurs condition qui vérifie les caractères qu'il y a dans le mot de passe et la longueur. if(var61.matches(".*[a-z].*")); { ++var7; } if(var61.matches(".*[A-Z].*")); { ++var7; } if(var61.matches(".*[0-9].*")); { ++var7; } if(var61.matches(".*[^a-zA-Z0-9].*")); { ++var7; } if(var61.length() < 6); { ++var7; } if(var61.length() >= 8); { ++var7; } if(var61.length() >= 14); { ++var7; } if(var61.length() >= 25); { ++var7; } if(var61.length() >= 35); { ++var7; } après , on dis au jeu de remplacer tout les . et les * var4 = var51 + " " + var61.replaceAll(".","*"); pour finir, on met notre dernière condition qui dit : Que après le mot de passe du joueur, on affiche le str4 if(var61.length() > 0) { var4 = var4 + " " + str4 + "§r"; } Et voilà, vos mots de passe sont cachés ! B] Captures d'écrans : Bientôt
  19. 1.x

    Installation de MCP Cette uvre est mise à disposition selon les termes de la Licence Creative Commons Attribution - Pas dUtilisation Commerciale - Pas de Modification 3.0 non transposé . Tout partage implique que vous citiez l'auteur original. -[iNTRODUCTION]- Bonjour à tous ! Dans ce tutoriel, je vais vous expliquer comment installer MCP, et en résoudre les bugs les plus courants ! -[sOMMAIRE]- 1] Pré-requis 2] Récupération du code source de Minecraft 3] Problèmes connus 1] Pré-requis Pour commencer le modding Minecraft, vous aurez besoin de plusieurs ressources : Le Java Developement Kit, plus communément nommé JDK. Vous pouvez trouver la version appropriée à votre système sur http://java.com Un Environement de Développement Intégré, ou EDI ou IDE (pour Integrated Development Environment). Dans ces tutos, nous utiliserons Eclipse, disponible gratuitement sur http://www.eclipse.org/downloads/ (choisissez la version appelée « Eclipse IDE for Java Developpers »). Une connaissance du langage de programmation Java. De nombreux cours sont disponibles sur la toile, nous vous invitons à y jeter un coup d'oeil. Une version officielle de Minecraft. 2] Récupération des sources de Minecraft* Pour commencer le modding Minecraft, vous aurez besoin de plusieurs ressources : Le code source de Minecraft s'obtient grâce à un logiciel appelé Mod Coder Pack, ou MCP. Vous pouvez le télécharger ici : http://mcp.ocean-labs.de/download.php. Une fois que vous aurez téléchargé le fichier ZIP contenant MCP, extrayez le dans un dossier, par exemple ModCoderPack. Des fichiers vont être extraits de l'archive, comme ceci : Vous devrez également lancez au moins une fois la version de Minecraft que vous souhaitez modifier depuis le launcher officiel. Si vous voulez également modifier le serveur, il vous faudra ensuite télécharger le fichier JAR du serveur. Vous pouvez trouver le serveur correspondant à votre version à ce lien. Ensuite, il suffira de le glisser dans le dossier « jars ». Puis lancez simplement decompile.sh (ou decompile.bat si vous êtes sous Windows) en double cliquant dessus (ou en console pour les intimes). Le programme va s'occuper de récupérer le code source, puis va créer l'architecture des fichiers nécessaire. Vous devriez vous apparaître des dossiers, pour finalement arriver à la figure suivante : Une fois cette étape terminée, vous pouvez ouvrir Eclipse et choisir comme répertoire de travail le sous dossier « eclipse »précédemment créé dans le dossier ModCoderPack : 3] Problèmes connus JSON non trouvé Si vous avez un message d'erreur tel que celui-ci après avoir lancé l'executable decompile : C'est que vous n'avez pas installé la version de Minecraft pour laquelle MCP a été configuré. Pour résoudre ce problème, lancez Minecraft dans la bonne version via le launcher officiel (dans l'exemple, 1.7.10). Project 'Client' is missing required library [...] Cela arrive lorsque certaines bibliothèques ne sont pas à jour. Pour corriger ce problème, il vous faut vous rendre dans la liste des bibliothèques : « Clic droit sur le projet Client Properties Java Build Path Libraries ». Ensuite, vous devrez sélectionner la ou les bibliothèques qui bloquent (elles sont signalées d'une croix rouges) et les supprimer en cliquant sur « Remove ». Ensuite, vous pourrez les ajouter à nouveau, avec le bon chemin d'accès cette fois. Par exemple, si j'obtiens le message d'erreur : Je dois me rendre dans la liste des bibliothèques, supprimer realms-1.5.4.jar et réajouter la bonne version, dans mon cas « jars/libraries/com/mojang/realms/realms-1.3.5.jar ». !! Missing server jar file. Aborting !! Cette erreur arrive quand vous n'avez pas téléchargé le minecraft_server1.x.x.jar ou que vous ne l'avez pas placé dans le dossier « jars ». Si vous ne souhaitez modifier que le client, ne vous affolez pas, et ne tenez pas compte de ce message, le client est lui décompilé.
  20. Avoir un pseudo fixe sur MCP ! Cette uvre est mise à disposition selon les termes de laLicence Creative Commons Attribution - Pas dUtilisation Commerciale - Pas de Modification 3.0 non transposé. Tout partage implique que vous citiez le/les auteur(s) original/originaux des parties utilisées. Un tutoriel a déjà été fait par un membre du forum, mais il a été archivé, et vu que certains n'ont pas envie de farfouiller, je me permets de refaire le tutoriel. Avec une autre méthode en plus. Voici tout de même le lien pour sa version du tutoriel, en 1.6. -[iNTRODUCTION]- Bonjour/bonsoir cher lecteur ! Ce tutoriel a pour but de t'expliquer comment avoir un pseudo fixe au démarrage de Minecraft via MCP (=Minecraft Coder Pack) ! -[PR-REQUIS]- Pour commencer, le principal est d'avoir un Minecraft en 1.6 ou 1.7 décompilé via MCP ! Et un cerveau aussi, pour pouvoir lire le tutoriel. -[sOMMAIRE]- 1] Méthode 1 : Directement dans le code 2] Méthode 2 : Dans les arguments de lancement d'éclipse (par Shark) 3] Quelques réponses utiles à certaines questions 1] Méthode 1 : Directement dans le code Pour commencer, ouvrez Eclipse si ce n'est pas déjà fait, et utiliser la workspace habituelle pour modder. Jusque là rien de compliqué. Ensuite, il s'agira d'aller chercher une classe nommée Main. Elle se situe dans le package nommé net.minecraft.client.main, pas dans « default package ». En suivant mes indications, vous devriez tomber sur une classe fonctionnant avec un système d'ArgumentAcceptingOptionSpec, allant de 1 à 19. Dans notre cas, cela sera la ligne 11 qui nous intéressera. ArgumentAcceptingOptionSpec var11 = var1.accepts("username").withRequiredArg().defaultsTo("Player" + Minecraft.getSystemTime() % 1000L, new String[0]); Explication: Le jeu accepte l'argument "username", et n'étant pas donné via MCP, il utilise celui par défaut, à savoir Player + les millisecondes du moment du lancement. Pour modifier ce pseudo, il nous suffira de remplacer tout ce que la parenthèse après .defaultsTo par notre pseudo. Le code ressemblera donc à ceci : ArgumentAcceptingOptionSpec var11 = var1.accepts("username").withRequiredArg().defaultsTo("TonPseudo"); Avantage de cette méthode : Simple et rapide Inconvénient de cette méthode : Modifie le code ce qui pourrait gêner certains, surtout lors d'un code partagé (Git ou Saros par exemple) Ca ne risque pas d'affecter Minecraft une fois qu'il sera recompilé ? Et bien non ! On définit ici le pseudonyme par défaut, mais une fois que le jeu est lancé via un launcher, même si la case n'est pas remplie, le pseudo par défaut est défini par NoName, et non pas le pseudo renseigné dans le code si dessus. Vous pouvez tout de même utilise la deuxième méthode si vous n'êtes pas optimiste sur ce point. 2] Méthode 2 : Dans les arguments de lancement d'éclipse (Shark) Pour commencer, ouvrez Eclipse sur votre projet MCP. Une fois cela fait, vous voyez ce petit bouton de lancement vert en haut ? Cliquez sur la flèche sur le côté, ce qui devrait ouvrir un petit menu déroulant. Cliquez donc sur Run Configurations... Une fenêtre devrait apparaître, si ce n'est pas déjà fait, cliquez sur Client dans la partie Java Application du menu à droite. Allez ensuite dans l'onglet Arguments, Dans la partie Program Arguments, marquez tout simplement --username VotrePseudo Cliquez sur Apply, puis Close, et voilà ! Avantages de cette méthode : - Marche pour toutes les versions (normalement), et même peut-être Forge ! - Simple, et propre car cela ne modifie pas le code ! 3] Quelques réponses utiles à certaines questions A quoi ça sert ? Pour être honnête avec vous, à pas grand chose. A part si vous êtes OP sur votre serveur et que vous ne voulez pas réop chaque Player... Et également pour les personnes souhaitant bénéficier de leur skin sur l'espace de développement. Tu as volé le tutoriel d'un autre ! Et bien si cela est votre point de vue, alors si vous voulez. L'ancien tutoriel a été cité plus haut, et le tutoriel a été archivé, cela évitera des recherches dans les archives, qui contiennent un nombre de pages qui m'est inconnu. J'ai tout de même bénéficié de l'accord du rédacteur de l'ancien tutoriel avant de faire celui-ci. Surtout que ce n'est que la partie 1 qui a été reprise. C'est tout pour cette astuce, merci d'avoir lu ! N'hésitez pas à laisser votre avis sur celle ci ! -- Corrigé, mis en page par Wytrem le 02.06.2015 à 21h15. -- Partie 2] ajoutée par TheShark34 le 02.06.2015 à 21h48
  21. Introduction: bonjour ou bonsoir, cela fait depuis un petit temps que je me suis lancé dans le codage java en suivant des tutorielles ... Je me débrouille très bien pour ce qui est du coté programmation de plugin bukkit mais pour Vanilla des fois ça coince un peu et je crée ce sujet pour vous expliquer comment modifier le nombre de blocs poussés par un piston (sticky et normal) cette modification est très simple, il s'agit de modifier 5 nombres mais il faut savoir lesquels comme j'ai longtemps cherché et que j'ai enfin trouvé et que je ne vois pas de TUTO sur ceci j'ai décidé d'en faire un (si je peux appeler sa un tuto ). Le Tutto marche en 1.7.X mais je n'ai pas travaillé dessus en 1.8 à vous de me dire ça petite astuce pour les apprentis moddeurs: ne pas recopier bêtement un code mais essayer de le comprendre j'ai fait ça avec tous les codes que j'ai appris et pour certain je suis au top. I: les fonctions: donc il faut se rendre dans votre vanilla dans le package net.minecraft.block. ensuite tout ce qui nous intéresse se trouve dans la class: BlockPistonBase normalement vous avez ceci : Ce qui nous intéressent se situe dans les fonction :func_150077_hetfunc_150079_i : on commence par la fonctionfunc_150077_h: ce qui nous intéresse c'est ceci : l.390 if (var8 < 13) l.408 if (var8 == 12) Ces deux conditions vont nous permettre de faire en sorte que le piston continue à faire son action ("son mouvement") de pousser jusqu'à ce que cette limite soit atteinte donc pour changer cette limite ex: 20 blocs il suffit de mettre if (var8 < 21) et if (var8 == 20) Voilà pour la première fonction nous passons àla deuxième:func_150079_i : ce qui nous intéresse ici se trouve à la ligne: l. 435 if (var9 < 13) l. 453 if (var9 == 12) l. 479 for (var13 = new Block[13]; var6 != p_150079_2_ || var7 != p_150079_3_ || var8 != p_150079_4_; var8 = var16) donc pareille que la fonction ci-dessus : modifier if (var9 <13) et if (var9 == 12) par if (var9 < 21) etif (var9 == 20) par contre là ça se corce un peu mais vous aller voir c'est tout simple à la ligne 479 il y a une boucle qui dit que tant qu'il n'y a pas X block derrière le piston on continue a faire "apparaître" des block ainsi que leur mouvement pour changer cette valeur il suffit de changernew Block[13] parnew Block[20] et voilà vous avez changé la limite de block poussé par un piston. Veuillez toutefois à ne pas mettre de différence de nombre dans les fonctions pour éviter des crashs et à mettre un nombre de blocs poussés pas trop élevé (je sais pas ce que son fait je n'ai pas tenté ) voilà jespère que les pro du modding vont être indulgent avec moi car je n'ai jamais fait de tuto et mes explications peuvent paraître incohérente pour vous mais peut-être pas pour les apprenties cordialement didoupimpon.
  22. Vanilla

    Les sets d'outils Cette uvre est mise à disposition selon les termes de la Licence Creative Commons Attribution - Pas dUtilisation Commerciale - Pas de Modification 3.0 non transposé . Tout partage implique que vous citiez l'auteur original. -[iNTRODUCTION]- Salut tout le monde ! En ce moment la plupart des demandes d'aide ont rapport avec les GUI. Contrairement à ce que croivent la plupart d'entre vous, ce n'est vraiment pas compliqué. Mais un tutoriel sera surement fort utile. Ce tutoriel fonctionne pour la 1.7, la 1.8, et surement (peut-être avec quelques modifications) pour la 1.6, où même peut-être pour la 1.5, ou moins. Dans ce tutoriel on va créer un nouveau menu principal, et un nouveau GUI simple. -[sOMMAIRE]- A] Partie A : Création de l'item [A 1] Préparation A] Création des outils 2] Création aprofondie A] Enregistrement B] Craft des outils C] Durabilité 3] Les textures et noms A] Textures des items B] Noms des items B] Partie B : Craftbukkit / Spigot [b 1] Préparation A] Création des outils 2] Création aprofondie A] Enregistrement B] Craft des outils C] Durabilité A] Partie A : Création des outils [A 2] Préparation A] Création des outils Pour commencer a créer votre set d'outils , rendez-vous dans la class Item.java. Celle-ci se situe dans le package net.minecraft.item 1] Item.java a] l'épée itemRegistry.addObject(ID, "NOM", (new ItemSword(Item.ToolMaterial.MINERAIS)).setUnlocalizedName("NOM_").setTextureName("NOM_TEXTURE")); b] la pelle itemRegistry.addObject(ID, "NOM", (new ItemSpade(Item.ToolMaterial.MINERAIS)).setUnlocalizedName("NOM_").setTextureName("NOM_TEXTURE")); c] la pioche itemRegistry.addObject(ID, "NOM", (new ItemPickaxe(Item.ToolMaterial.MINERAIS)).setUnlocalizedName("NOM_").setTextureName("NOM_TEXTURE")); d] la hache itemRegistry.addObject(ID, "NOM", (new ItemAxe(Item.ToolMaterial.MINERAIS)).setUnlocalizedName("NOM_").setTextureName("NOM_TEXTURE")); e] la hoe itemRegistry.addObject(ID, "NOM", (new ItemHoe(Item.ToolMaterial.MINERAIS)).setUnlocalizedName("NOM_").setTextureName("NOM_TEXTURE")); 2] Aide pour le item.java ID remplacez par l'id de votre item NOM remplacez par le nom de votre item NOM_ remplacez par le nom IN GAME de votre item NOM_TEXTURE remplacez par le nom de la texture de votre item ATTENTION vous avez une erreur , c'est normal , nous allons y remédier ! 2] Création aprofondie A] Enregistrement Maintenant , nous allons enregistrer nos items pour que minecraft puisse les reconnaitre ! Ainsi , nous pourrons aussi créer le craft ! Rendez vous dans la class Items.java située dans le package net.minecraft.init A] Items.java a] l'épée public static final Item NOM = (Item)Item.itemRegistry.getObject("NOM"); b] la pelle public static final Item NOM = (Item)Item.itemRegistry.getObject("NOM"); c] la pioche public static final Item NOM = (Item)Item.itemRegistry.getObject("NOM"); d] la hache public static final Item NOM = (Item)Item.itemRegistry.getObject("NOM"); e] la hoe public static final Item NOM = (Item)Item.itemRegistry.getObject("NOM"); 2] Aide pour le items.java NOM remplacez par le nom de votre item B] Craft des outils Maintenant , nous allons faire le craft de nos items ! Rendez vous dans la class RecipesTool.java située dans le package net.minecraft.item.crafting Pour plus de simplicité , j'ai ranger le code pour m'y retrouver ATTENTION Vous devez avoir créer un "minerais" ! Si ce n'est pas le cas , aller en bas du tutoriel ! a] Tout d'abord, ajoutons le minerais à mettre pour réaliser le craft {Blocks.planks, Blocks.cobblestone, Items.iron_ingot, Items.diamond, Items.gold_ingot}, a.1] Pour ajouter le minerais, faites comme ceci : {Blocks.planks, Blocks.cobblestone, Items.iron_ingot, Items.diamond, Items.gold_ingot, Items.MINERAIS}, b] Maintenant, passons aux outils {Items.wooden_pickaxe, Items.stone_pickaxe, Items.iron_pickaxe, Items.diamond_pickaxe, Items.golden_pickaxe}, {Items.wooden_shovel, Items.stone_shovel, Items.iron_shovel, Items.diamond_shovel, Items.golden_shovel}, {Items.wooden_axe, Items.stone_axe, Items.iron_axe, Items.diamond_axe, Items.golden_axe}, {Items.wooden_hoe, Items.stone_hoe, Items.iron_hoe, Items.diamond_hoe, Items.golden_hoe}}; b.1] Pour ajouter le craft d'un outils , faites comme ceci : {Items.wooden_pickaxe, Items.stone_pickaxe, Items.iron_pickaxe, Items.diamond_pickaxe, Items.golden_pickaxe, Items.NOM_PIOCHE}, {Items.wooden_shovel, Items.stone_shovel, Items.iron_shovel, Items.diamond_shovel, Items.golden_shovel, Items.NOM_PELLE}, {Items.wooden_axe, Items.stone_axe, Items.iron_axe, Items.diamond_axe, Items.golden_axe, Items.NOM_HACHE}, {Items.wooden_hoe, Items.stone_hoe, Items.iron_hoe, Items.diamond_hoe, Items.golden_hoe, Items.NOM_HOE}}; c] L'épée : le craft de l'épée se situe dans la class RecipesWeapons.java dans le package ( Net.minecraft.item.crafting ) c.1] Tout d'abord, ajoutons le minerais à mettre pour réaliser le craft {Blocks.planks, Blocks.cobblestone, Items.iron_ingot, Items.diamond, Items.gold_ingot}, c.2] Pour ajouter le minerais, faites comme ceci : {Blocks.planks, Blocks.cobblestone, Items.iron_ingot, Items.diamond, Items.gold_ingot, Items.MINERAIS}, b] Maintenant, passons au craft de l'épée this.recipeItems = new Object[][] {{Blocks.planks, Blocks.cobblestone, Items.iron_ingot, Items.diamond, Items.gold_ingot, Items.obsi, Items.zinc, Items.mercure, Items.saphir}, {Items.wooden_sword, Items.stone_sword, Items.iron_sword, Items.diamond_sword, Items.golden_sword}}; Pour le craft de l'épée , c'est très simple , faites comme ceci : this.recipeItems = new Object[][] {{Blocks.planks, Blocks.cobblestone, Items.iron_ingot, Items.diamond, Items.gold_ingot, Items.obsi, Items.zinc, Items.mercure, Items.saphir}, {Items.wooden_sword, Items.stone_sword, Items.iron_sword, Items.diamond_sword, Items.golden_sword, Items.NOM_EPEE}}; B] Durablilité Maintenant, nous allons faire la durabilité de nos outils ! Pour cella , rendez vous dans la class Item.java située dans le package net.minecraft.item ! Vers la ligne 900 vous devriez trouver ça : public static enum ToolMaterial { WOOD("WOOD", 0, 0, 59, 2.0F, 0.0F, 15), STONE("STONE", 1, 1, 131, 4.0F, 1.0F, 5), IRON("IRON", 2, 2, 250, 6.0F, 2.0F, 14), EMERALD("EMERALD", 3, 3, 1561, 8.0F, 3.0F, 10), GOLD("GOLD", 4, 0, 32, 12.0F, 0.0F, 22); a] Durabilité de l'item Pour la durabilité, ajouter une ligne avec ceci : MINERAIS("MINERAIS", 4, 0, 32, 12.0F, 0.0F, 22); ATTENTION Mettez une virgule a la place du point-virgule a celui de l'or car comme vous pouvez le voir, il y a un Static FINAL 2] Aide pour la durabilité MINERAIS remplacez par le nom de votre minerais 32 remplacez par la durabilité de votre outils 12.0remplacez par la vitesse de minage de votre outil 0.0remplacez par les dégâts de votre outils, 22 remplacez par la rareté de l'enchantement sur votre item ( plus ne nombre est bas, plus les enchantements sont rares ) 3] Modification de la class item.java ( new.minecraft.item ) Maintenant, vous pouvez retourner près de la déclaration de vos outils et changer .MINERAIS en .LeNomDeVotreMinerais 3] Les textures et noms A] Textures des items Pour les textures de vos items , c'est TRES simple , il vous suffit d'ouvrir le 1.7.X.jar qui se situe dans VotreDossierMCP->Jar->1.7.X -> 1.7.X.jar quand celui-ci est ouvert , aller dans Assets -> Minecraft -> textures -> items Là , posez vos textures ATTENTION Nommez bien vos texture comme dans la déclaration de vos outils ! B] Noms des items Pour les noms de vos items , c'est TRES simple , il vous suffit d'ouvrir le 1.7.X.jar qui se situe dans VotreDossierMCP->Jar->1.7.X -> 1.7.X.jar quand celui-ci est ouvert , aller dans Assets -> Minecraft -> lang Ouvrez en_US.lang Là , allez OU vous voulez et mettez ceci : item.NOM.name=NOM 2] Aide pour les noms des outils Pour vous aidez, dans la déclaration de votre item , il y avait un setUnlocalizedName("NOM") reprenez ce nom et mettre le apres le item. ensuite, après le = mettez le nom de l'item IN GAME B] Partie B : Craftbukkit / Spigot [b BIENTOT
  23. Vanilla

    Barre d'armure amélioré -[iNTRODUCTION]- Bonjour à tous ! Dans ce tutoriel, nous allons modifier l'affiche de la barre d'armure dans le guiIngame. -[sOMMAIRE]- 1]La classe 2]Etude du code 3]Mise en pratique 1]La classe D'abord allons ici: net.minecraft.client.gui.GuiIngame.java C'est dans cette classe que tout le gui en jeu tel que la barre de vie, barre d'inventaire se fait. 2]Etude du code Maintenant on va ici: this.mc.mcProfiler.startSection("armor"); int var22; int var23; for (var22 = 0; var22 < 10; ++var22) { if (var20 > 0) { var23 = var11 + var22 * 8; if (var22 * 2 + 1 < var20) { this.drawTexturedModalRect(var23, var18, 34, 9, 9, 9); } if (var22 * 2 + 1 == var20) { this.drawTexturedModalRect(var23, var18, 25, 9, 9, 9); } if (var22 * 2 + 1 > var20) { this.drawTexturedModalRect(var23, var18, 16, 9, 9, 9); } } } Ensuite on sintéresse a ces trois lignes: this.drawTexturedModalRect(var23, var18, 34, 9, 9, 9); this.drawTexturedModalRect(var23, var18, 25, 9, 9, 9); this.drawTexturedModalRect(var23, var18, 16, 9, 9, 9); C'est donc la fonction: public void drawTexturedModalRect(int par1, int par2, int par3, int par4, int par5, int par6) Ce qui nous intéresse donc le par1 est la position en x de ta barre ,le par2 est la position en y , le par3 est la position en x sur l'image icons.png pareil pour le par4 qui est la position en y sur le icons.png, et le par5 est la longueur en x de ce que t'affiche et par6 est la largeur en y. Donc pour déplacer ton gui vers la droite de 10 et 20 en hauteur change juste le par1 et le par2 comme ca : this.drawTexturedModalRect(var23 + 10, var18 + 20, 34, 9, 9, 9); this.drawTexturedModalRect(var23 + 10, var18 + 20, 25, 9, 9, 9); this.drawTexturedModalRect(var23 + 10, var18 + 20, 16, 9, 9, 9); 3] Mise en pratique Nous allons utiliser ceci: Fourni par SwatX18 Enregistrez cette image et placer la dans votre 1.7.x.jar ici: assets/minecraft/texture/gui/icons.png Après avoir fait ceci nous pouvons passer au code. Comme vous pouvez le voir sur icons.png on a rajouter une armure en or nous allons donc l'afficher a partir du moment ou le total de point d'armure est supérieur a celui maximum de minecraft de base (armure en diamant),la valeur max est de 20 dans chaque méthode l'affichage supportera 40 points. A partir de maintenant c'est très simple vous avez juste a remplacer le code vue dans la première parti par une des méthode proposé. Methode 1: Rendu: Code: this.mc.mcProfiler.startSection("armor"); int var22; int var23; if(var20 >20){ var23 = var11 ; this.drawTexturedModalRect(var23-9, var18, 142, 9, 9, 9); for (var22 = 0; var22 < 10; ++var22) { if (var20 > 0) { var23 = var11 + var22 * 8; if (var22 * 2 + 1 +20< var20) { this.drawTexturedModalRect(var23, var18, 34, 9, 9, 9); } if (var22 * 2 + 1+20 == var20) { this.drawTexturedModalRect(var23, var18, 25, 9, 9, 9); } if (var22 * 2 + 1+20 > var20) { this.drawTexturedModalRect(var23, var18, 16, 9, 9, 9); } } } }else{ for (var22 = 0; var22 < 10; ++var22) { if (var20 > 0) { var23 = var11 + var22 * 8; if (var22 * 2 + 1 < var20) { this.drawTexturedModalRect(var23, var18, 34, 9, 9, 9); } if (var22 * 2 + 1 == var20) { this.drawTexturedModalRect(var23, var18, 25, 9, 9, 9); } if (var22 * 2 + 1 > var20) { this.drawTexturedModalRect(var23, var18, 16, 9, 9, 9); } } } } Methode 2 : Rendu: Code: this.mc.mcProfiler.startSection("armor"); int var22; int var23; if(var20 >20){ var23 = var11 ; for (var22 = 0; var22 < 10; ++var22) { if (var20 > 0) { var23 = var11 + var22 * 8; if (var22 * 2 + 1 +20< var20) { this.drawTexturedModalRect(var23, var18, 142, 9, 9, 9); } if (var22 * 2 + 1+20 == var20) { this.drawTexturedModalRect(var23, var18, 133, 9, 9, 9); } if (var22 * 2 + 1+20 > var20) { this.drawTexturedModalRect(var23, var18, 124, 9, 9, 9); } } } }else{ for (var22 = 0; var22 < 10; ++var22) { if (var20 > 0) { var23 = var11 + var22 * 8; if (var22 * 2 + 1 < var20) { this.drawTexturedModalRect(var23, var18, 34, 9, 9, 9); } if (var22 * 2 + 1 == var20) { this.drawTexturedModalRect(var23, var18, 25, 9, 9, 9); } if (var22 * 2 + 1 > var20) { this.drawTexturedModalRect(var23, var18, 16, 9, 9, 9); } } } } Methode 3: Rendu: Code: this.mc.mcProfiler.startSection("armor"); int var22; int var23; for (var22 = 0; var22 < 10; ++var22) { if (var20 > 0) { var23 = var11 + var22 * 8; if (var22 * 2 + 1 < var20) { this.drawTexturedModalRect(var23, var18, 34, 9, 9, 9); } if (var22 * 2 + 1 == var20) { this.drawTexturedModalRect(var23, var18, 25, 9, 9, 9); } if (var22 * 2 + 1 > var20) { this.drawTexturedModalRect(var23, var18, 16, 9, 9, 9); } } } if(var20 >20){ var23 = var11 ; for (var22 = 0; var22 < 10; ++var22) { if (var20 > 0) { var23 = var11 + var22 * 8; if (var22 * 2 + 1 +20< var20) { this.drawTexturedModalRect(var23+8*10, var18, 142, 9, 9, 9); } if (var22 * 2 + 1+20 == var20) { this.drawTexturedModalRect(var23+8*10, var18, 133, 9, 9, 9); } } } } Methode 4: Rendu: Code: this.mc.mcProfiler.startSection("armor"); int var22; int var23; for (var22 = 0; var22 < 10; ++var22) { if (var20 > 0) { var23 = var11 + var22 * 8; if (var22 * 2 + 1 < var20) { this.drawTexturedModalRect(var23, var18, 34, 9, 9, 9); } if (var22 * 2 + 1 == var20) { this.drawTexturedModalRect(var23, var18, 25, 9, 9, 9); } if (var22 * 2 + 1 > var20) { this.drawTexturedModalRect(var23, var18, 16, 9, 9, 9); } } } if(var20 >20){ var23 = var11 ; for (var22 = 0; var22 < 10; ++var22) { if (var20 > 0) { var23 = var11 + var22 * 8; if (var22 * 2 + 1 +20< var20) { this.drawTexturedModalRect(var23, var18, 142, 9, 9, 9); } if (var22 * 2 + 1+20 == var20) { this.drawTexturedModalRect(var23, var18, 133, 9, 4, 9); } } } } Methode 5: Rendu : Code: this.mc.mcProfiler.startSection("armor"); int var22; int var23; for (var22 = 0; var22 < 10; ++var22) { if (var20 > 0) { var23 = var11 + var22 * 8; if (var22 * 2 + 1 < var20) { this.drawTexturedModalRect(var23, var18, 34, 9, 9, 9); } if (var22 * 2 + 1 == var20) { this.drawTexturedModalRect(var23, var18, 25, 9, 9, 9); } if (var22 * 2 + 1 > var20) { this.drawTexturedModalRect(var23, var18, 16, 9, 9, 9); } } } if(var20 >20){ var23 = var11 ; for (var22 = 0; var22 < 10; ++var22) { if (var20 > 0) { var23 = var11 + var22 * 8; if (var22 * 2 + 1 +20< var20) { this.drawTexturedModalRect(var23, var18-9, 142, 9, 9, 9); } if (var22 * 2 + 1+20 == var20) { this.drawTexturedModalRect(var23, var18-9, 133, 9, 9, 9); } if (var22 * 2 + 1 +20 > var20) { this.drawTexturedModalRect(var23, var18-9, 124, 9, 9, 9); } } } } Merci d'avoir regarder mon premier tuto et encore merci aSwatX18 pour m'avoir fourni l'image "icons.png"