Créer une table de craft compatible avec JEI et NEI
-
J’ai donc fait
sa
private TutorielCraftingManager() { addShapelessRecipe(new ItemStack(Blocks.anvil), Items.carrot, Items.golden_apple); addRecipe(new ItemStack(cratingTable), " C ", "X X", " C ", 'C', "slabWood", 'X', Blocks.planks); //"slabWood" est le nom des dalles de bois dans l'ore dictionnary, ceci est ajouté par Forge addRecipe(new ItemStack(Items.golden_apple), "A A", "X X", "X X", "A A", 'A', Items.carrot, 'X', Blocks.planks); }Le crash est plus la mais maintenant quand je fais clique droit sur le block cela me fait rien x)
logs
[19:39:54] [Server thread/INFO] [STDOUT]: [ed.enderdeath.mod.AnvilDragon.BlockAnvilDragon:onBlockActivated:21]: je suis dans le onblockactivated[19:39:54] [Server thread/INFO] [STDOUT]: [ed.enderdeath.mod.AnvilDragon.BlockAnvilDragon:onBlockActivated:24]: je suis dans la condition world.IsRemote
-
ça ne devrait pas, vu qu’il s’ouvrait avant, mets des print un peu partout, dans le GuiHandler, les constructeurs du gui et du container, et si ils sont appelés, dans la fonction de draw.
-
Merci de ta réponse

donc j’ai mis des system.out
et donc sa me affiche sa
[17:48:36] [Client thread/INFO] [STDOUT]: [ed.enderdeath.mod.AnvilDragon.BlockAnvilDragon:onBlockActivated:21]: je suis dans le onblockactivated
[17:48:36] [Server thread/INFO] [STDOUT]: [ed.enderdeath.mod.AnvilDragon.BlockAnvilDragon:onBlockActivated:21]: je suis dans le onblockactivated
[17:48:36] [Server thread/INFO] [STDOUT]: [ed.enderdeath.mod.AnvilDragon.BlockAnvilDragon:onBlockActivated:24]: je suis dans la condition world.IsRemote
[17:48:36] [Server thread/INFO] [STDOUT]: [ed.enderdeath.mod.common.GuiHandler:getServerGuiElement:33]: Je suis dans le getServGuiElement
[17:48:36] [Server thread/INFO] [STDOUT]: [ed.enderdeath.mod.common.GuiHandler:getServerGuiElement:36]: Je suis dans la condition container
[17:48:36] [Client thread/INFO] [STDOUT]: [ed.enderdeath.mod.common.GuiHandler:getClientGuiElement:45]: Je suis dans le getCLientGuiElement
[17:48:36] [Client thread/INFO] [STDOUT]: [ed.enderdeath.mod.common.GuiHandler:getClientGuiElement:57]: Je suis dans la condition guiet la je ne comprend plus rien car tout est bien appelé
Merci de ton aide

-
Oui c’est bizarre, il y a d’ailleurs un post semblable dans le support… As-tu essayé des print dans les constructeurs du gui et du container, et dans la fonction draw ?
-
je l’ai fait

[20:13:07] [Client thread/INFO] [STDOUT]: [ed.enderdeath.mod.AnvilDragon.BlockAnvilDragon:onBlockActivated:21]: je suis dans le onblockactivated
[20:13:07] [Server thread/INFO] [STDOUT]: [ed.enderdeath.mod.AnvilDragon.BlockAnvilDragon:onBlockActivated:21]: je suis dans le onblockactivated
[20:13:07] [Server thread/INFO] [STDOUT]: [ed.enderdeath.mod.AnvilDragon.BlockAnvilDragon:onBlockActivated:24]: je suis dans la condition world.IsRemote
[20:13:07] [Server thread/INFO] [STDOUT]: [ed.enderdeath.mod.common.GuiHandler:getServerGuiElement:33]: Je suis dans le getServGuiElement
[20:13:07] [Server thread/INFO] [STDOUT]: [ed.enderdeath.mod.common.GuiHandler:getServerGuiElement:36]: Je suis dans la condition container
[20:13:07] [Server thread/INFO] [STDOUT]: [ed.enderdeath.mod.AnvilDragon.ContainerDragonAnvil:<init>:39]: Test Container
[20:13:07] [Server thread/INFO] [STDOUT]: [ed.enderdeath.mod.AnvilDragon.DragonSlotCrafting:<init>:35]: Test Slot
[20:13:07] [Client thread/INFO] [STDOUT]: [ed.enderdeath.mod.common.GuiHandler:getClientGuiElement:45]: Je suis dans le getCLientGuiElement
[20:13:07] [Client thread/INFO] [STDOUT]: [ed.enderdeath.mod.common.GuiHandler:getClientGuiElement:57]: Je suis dans la condition gui
[20:13:07] [Client thread/INFO] [STDOUT]: [ed.enderdeath.mod.AnvilDragon.ContainerDragonAnvil:<init>:39]: Test Container
[20:13:07] [Client thread/INFO] [STDOUT]: [ed.enderdeath.mod.AnvilDragon.DragonSlotCrafting:<init>:35]: Test Slot
[20:13:07] [Client thread/INFO] [STDOUT]: [ed.enderdeath.mod.AnvilDragon.GuiAnvilDragon:<init>:25]: Test Gui
[20:13:07] [Client thread/INFO] [STDOUT]: [ed.enderdeath.mod.AnvilDragon.TutorielCraftingManager:<init>:32]: Test CraftManager
[20:13:07] [Client thread/INFO] [STDOUT]: [ed.enderdeath.mod.AnvilDragon.TutorielShapelessRecipe:<init>:27]: Test ShapelessRecipe
[20:13:07] [Client thread/INFO] [STDOUT]: [ed.enderdeath.mod.AnvilDragon.TutorielShapedRecipes:<init>:45]: Test ShapedR
[20:13:07] [Client thread/INFO] [STDOUT]: [ed.enderdeath.mod.AnvilDragon.TutorielShapedRecipes:<init>:45]: Test ShapedRet sa affiche bien bizarree</init></init></init></init></init></init></init></init></init>
-
Tout est là, maintenant, enlève ces prints (on a vu que ça marchait) et mets-en 1 dans la fonction draw, si il n’est pas appelé, mais en un dans la fonction initGui() (créées la si tu ne l’as pas).
-
la fonctions draw ou initgui de quel classe ?
-
Bah du gui ^^
Et c’est pas draw, c’est drawMachinChose. -
oki

Donc j’ai mis system.out sur c’est 2 fonction@Override protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) { fontRendererObj.drawString(I18n.format("container.crafting_table"), 100, 5, 0xFFFFFF); //On dessine le "titre" du gui, le I18n.format va traduire le texte donné, n'oubliez pas de l'ajouter dans votre fichier de langues ! System.out.println("Test draw"); } /** * Fonction pour dessiner l'arrière plan */ @Override protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY) { mc.getTextureManager().bindTexture(texture); //On bind la texture drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); //Et on la dessine System.out.println("Test draw"); }et quand je fais clique droit cela ne fait rien
-
au passage ma classe
package ed.enderdeath.mod.AnvilDragon; import java.util.HashMap; import org.lwjgl.opengl.GL11; import ed.enderdeath.mod.Extractor.ContainerAlloyer; import ed.enderdeath.mod.Extractor.GuiAlloyer; import ed.enderdeath.mod.Extractor.TileEntityAlloyer; import ed.enderdeath.mod.common.enderdeath; import net.minecraft.client.gui.Gui; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.util.ResourceLocation; import net.minecraft.world.World; public class GuiAnvilDragon extends GuiContainer { private static final ResourceLocation texture = new ResourceLocation(enderdeath.MODID,"textures/gui/container/GuiAlloyer.png"); public GuiAnvilDragon(InventoryPlayer invPlayer, World world, int x,int y,int z) { super(new ContainerDragonAnvil(invPlayer, world,x,y,z)); this.xSize = 176; //La largeur du gui en pixels (supprimez-le pour laisser celle par défaut) this.ySize = 188; //La hauteur du gui en pixels (supprimez-le pour laisser celle par défaut) } /** * Fonction pour dessiner le premier plan */ @Override protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) { fontRendererObj.drawString(I18n.format("container.crafting_table"), 100, 5, 0xFFFFFF); //On dessine le "titre" du gui, le I18n.format va traduire le texte donné, n'oubliez pas de l'ajouter dans votre fichier de langues ! System.out.println("Test draw"); } /** * Fonction pour dessiner l'arrière plan */ @Override protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY) { mc.getTextureManager().bindTexture(texture); //On bind la texture drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); //Et on la dessine System.out.println("Test draw"); } } -
Re
Nn ne t’inquiète pas tout est réglé mais c’est une demande que je te fais tu pourrai me passé la texture stp
-
La texture du gui ? Oui sans pb (je vais edit).
Ici : http://imgur.com/csgvbSN
-
Un tutoriel sur JEI est en cours de rédaction, il expliquera comment adapter la table de cratf à JEI aussi comment l’utiliser pour un four custom.
Un peut plus tard suivra une partie sur NEI. -
Salutations,
Je me permets d’ajouter une petite amélioration sur la classe Container qui est exposé dans ce tutoriel.
Pour la fonction transferStackInSlot, il est en fait possible d’adapter les transferts d’item dans le slots en fonction de la taille du craft.
En effet, les valeurs du slotIndex dans les différents if nécessitent juste d’être ajustées.
Je vous redirige vers ce topic pour adapter correctement vos valeurs (elles sont modifiées exprès pour une table de craft 5x5 mais vous ne devriez pas avoir de gros problème d’ajustement pour une 4x4)
Si vous patinez un peu, je vous conseille d’aller regarder la classe ContainerWorkbench dans le package package net.minecraft.inventory pour voir un peu la logique de tout le bidule.

EDIT: voir ma réponse ici pour avoir les vraies bonnes valeurs !
-
Je dois dire que ce n’est pas une mauvaise idée, l’adapterais donc le tuto prochainement, mais par contre dans le lien que tu as donné les valeurs dand la fonction sont les mêmes qu’ici.
-
@‘AymericRed’:
Je dois dire que ce n’est pas une mauvaise idée, l’adapterais donc le tuto prochainement, mais par contre dans le lien que tu as donné les valeurs dand la fonction sont les mêmes qu’ici.
Woops, effectivement ! Le comble c’est que je n’arrive plus à retrouver l’endroit exact où j’ai chopé ces valeurs, haha.
Pour me faire pardonner, je mets directement mon code ci-dessous (fonctionnant pour une table de craft 5x5 */!*)@Override public ItemStack transferStackInSlot(EntityPlayer player, int slotId) { ItemStack itemstack = null; Slot slot = this.inventorySlots.get(slotId); if (slot != null && slot.getHasStack()) { ItemStack itemstack1 = slot.getStack(); itemstack = itemstack1.copy(); /** * If the slot belongs to the craftResult slot, * Put the itemStack in the 27 slots player inventory */ if (slotId == 0) { if (!this.mergeItemStack(itemstack1, 26, 62, true)) { return (null); } slot.onSlotChange(itemstack1, itemstack); } /** * If the slot belongs to the 27 slots player inventory, * Put the itemStack in the 9 slots player hotbar */ else if (slotId >= 26 && slotId < 53) { if (!this.mergeItemStack(itemstack1, 53, 62, false)) { return (null); } } /** * If the slot belongs to the 9 slots player hotbar, * Put the itemStack in the 27 slots player inventory */ else if (slotId >= 53 && slotId < 62) { if (!this.mergeItemStack(itemstack1, 26, 53, false)) { return (null); } } /** * If the slot doesn't match with any of the if condition above, * Put the itemStack in the whole player inventory (hotbar + 27 slots) */ else if (!this.mergeItemStack(itemstack1, 26, 62, false)) { return (null); } if (itemstack1.stackSize == 0) { slot.putStack((ItemStack) null); } else { slot.onSlotChanged(); } if (itemstack1.stackSize == itemstack.stackSize) { return (null); } slot.onPickupFromSlot(player, itemstack1); } return (itemstack); }J’ai même commenté pour que ce soit plus clair !

Je me permets encore une fois aux personnes qui liront ce message plus tard, qu’en fin de compte ces fameuses valeurs (26, 53, 62) sont propres à la taille du inventorySlots de votre container (qui change à chaque fois que vous faites this.addSlotToContainer). À vous d’adapter ces valeurs en fonction de la grille de craft 4x4, 6x6 ou 100x100, etc…
-
Merci d’avoir mis ça, je m’en inspirerait, mais avec un truc dynamique changeant selon la taille de la grille ^^
EDIT : C’est fait
-
Bonjour ! ,
Je suis en train de créer la table de craft en 1.7.10 mais j’ai un BIG problem …
eclipse me dit qu’il y a une erreur ici (sur le .add), dans la fonction public AdvancedShapedRecipes addRecipe , dans la class container :AdvancedShapedRecipes shapedrecipes = new AdvancedShapedRecipes(j, k, aitemstack, result); this.recipes.add(shapedrecipes); return shapedrecipes;J’attends une réponse avec impatience ! (parce que c’est la seule erreur qui reste dans mon code
) -
Bonjour,
“dans la class container”
Tu ne parles pas plutôt de la classe du CraftingManager ?Quel est l’erreur indiquée exactement ? Et montre la classe entière avec les imports visibles.
-
Oui désolé je viens de me rendre compte que je me suis trompé , en même temps ça fait bien longtemps que j’éssaie de faire fonctionner ma table de craft et je suis un peu beaucoup fatigué
!Voici ma classe AdvancedCraftingRecipes :
package com.iutils.infinite.recipes; import java.util.List; import java.util.Map; import javax.annotation.Nullable; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import net.minecraft.block.Block; import net.minecraft.inventory.InventoryCrafting; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipe; import net.minecraft.world.World; public class AdvancedCraftingManager { private static final AdvancedCraftingManager INSTANCE = new AdvancedCraftingManager(); public static AdvancedCraftingManager getInstance() { return INSTANCE; } /** La liste des recettes */ private final List <irecipe>recipes = Lists.<irecipe>newArrayList(); private AdvancedCraftingManager() { //Vous pouvez ajouter des recettes ici } /** * Adds a shaped recipe to the games recipe list. */ public AdvancedShapedRecipes addRecipe(ItemStack result, Object… recipeComponents) { String s = ""; int i = 0; int j = 0; int k = 0; if (recipeComponents* instanceof String[]) { String[] astring = (String[])((String[])recipeComponents[i++]); for (int l = 0; l < astring.length; ++l) { String s2 = astring[l]; ++k; j = s2.length(); s = s + s2; } } else { while (recipeComponents* instanceof String) { String s1 = (String)recipeComponents[i++]; ++k; j = s1.length(); s = s + s1; } } Character character; Map <character, object="">components = Maps.<character, object="">newHashMap(); Object in; for ( ; i < recipeComponents.length; i += 2) { in = recipeComponents_; Object component = null; character = (Character)recipeComponents*; if (in instanceof Item) { component = new ItemStack((Item)recipeComponents_); } else if (in instanceof Block) { component = new ItemStack((Block)recipeComponents_, 1, 32767); } else if (in instanceof ItemStack) { component = (ItemStack)recipeComponents_; } else if (in instanceof String) { component = (String)in; } else { throw new IllegalArgumentException("Invalid shaped recipe: unknown type " + in.getClass().getName() + "!"); } components.put(character, component); } Object[] aitemstack = new Object[j * k]; char key; Object component; for (int i1 = 0; i1 < j * k; ++i1) { key = s.charAt(i1); if (components.containsKey(Character.valueOf(key))) { component = components.get(Character.valueOf(key)); if(component instanceof ItemStack) aitemstack[i1] = ((ItemStack)component).copy(); else aitemstack[i1] = component; } else aitemstack[i1] = null; } AdvancedShapedRecipes shapedrecipes = new AdvancedShapedRecipes(j, k, aitemstack, result); this.recipes.add(shapedrecipes); return shapedrecipes; } /** * Adds a shapeless crafting recipe to the the game. */ public void addShapelessRecipe(ItemStack result, Object… recipeComponents) { List list = Lists.newArrayList(); for (Object component : recipeComponents) //Pour chaque composant de la recette { if (component instanceof ItemStack) { list.add(((ItemStack)component).copy()); } else if (component instanceof Item) { list.add(new ItemStack((Item)component)); } else if(component instanceof Block) { list.add(new ItemStack((Block)component)); } else if(component instanceof String) //Pour l'ore dictionnary { list.add(component); } else throw new IllegalArgumentException("Invalid shapeless recipe: unknown type " + component.getClass().getName() + "!"); } this.recipes.add(new AdvancedShapelessRecipe(result, list)); } /** * Adds an IRecipe to the list of crafting recipes. */ public void addRecipe(IRecipe recipe) { this.recipes.add(recipe); } /** * Retourne le résultat de la recette ou null si il n'y en a aucun */ @Nullable public ItemStack findMatchingRecipe(InventoryCrafting craftMatrix, World worldIn) { for (IRecipe irecipe : this.recipes) //Pour chaque recette { if (irecipe.matches(craftMatrix, worldIn)) //Si elle correspond à la matrice actuelle { return irecipe.getCraftingResult(craftMatrix); //On donne son résultat } } return null; } /** * Retourne les items retants après un craft */ public List <irecipe>getRecipeList() { return this.recipes; } }eclipse me dit : The method add(IRecipe) in the type List <irecipe>is not applicable for the arguments (AdvancedShapedRecipes)
version pastebin !
Problème réglé , j’ai mis ça a la place :
AdvancedShapedRecipes shapedrecipes = new AdvancedShapedRecipes(j, k, aitemstack, result); this.recipes.add(new AdvancedShapelessRecipe(result, recipes)); return shapedrecipes;par contre j’ai un problème , quand je fais un clic droit sur mon bloc , mon curseur de souris apparait un fragment de secondes et disparaît comme si le container s’ouvrait puis se refermait très rapidement.
EDIT : Corrigé !</irecipe></irecipe>____</character,></character,></irecipe></irecipe>