Créer une table de craft compatible avec JEI et NEI
-
@‘AymericRed’:
Alors j’ai regardé rapidement le SlotCrafting de mc 1.7.10, il faut que tu retires toutes les fonctions getRemainingItems du crafting manager et des classes de recette, puis recopies la fonction onPickupFromSlot de la classe SlotCrafting dans la classe de ton Slot.
Merci je vais faire cela :)___Donc Petite question j’enlève
public TutorielShapedRecipes 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; } TutorielShapedRecipes shapedrecipes = new TutorielShapedRecipes(j, k, aitemstack, result); this.recipes.add(shapedrecipes); return shapedrecipes; }
et
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 TutorielShapelessRecipe(result, list)); }
et
public ItemStack[] getRemainingItems(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.getRemainingItems(craftMatrix); //On retourne les items restants } } ItemStack[] aitemstack = new ItemStack[craftMatrix.getSizeInventory()]; for (int i = 0; i < aitemstack.length; ++i) { aitemstack* = craftMatrix.getStackInSlot(i); } return aitemstack; //Si ça ne correspond à aucune recette, on retourne tous les items qui sont présents dans la matrice }
?
Merci de ton aide ;)____</character,></character,>
-
J’ai enlevé c’est méthode et sa ne marche pas
voici mes classes
Container
http://pastebin.com/hiLFTGHVBlockCraftCustom
http://pastebin.com/49s4j5pRSlot
http://pastebin.com/PPY9L6kCgui
http://pastebin.com/UPSfxNUXTutorielCraftingManager
http://pastebin.com/ZsSRGZWZMerci de ton aide
-
Non il ne faut pas enlever les fonctions d’ajout de recette, juste getRemainingItems, sinon tes classes sont bonnes (le container, le slot et le craftingmanager en tout cas), sauf ça : ```java
@Override
public boolean canInteractWith(EntityPlayer player)
{
return this.worldObj.getBlock(x, y, z) != enderdeath.AnvilDragon;
} -
Bonjour AymericRed
Merci infiniment de ton aide
J’ai 1 dernier problème sur une ligne
c’est cette lignereturn stack1.getItem() == stack2.getItem() && (stack1() == OreDictionary.WILDCARD_VALUE || stack1.getMetadata() == stack2.getMetadata());
ici il me propose de crée une méthode
stack1()
et ici
stack1.getMetadata() == stack2.getMetadata());
la méthode Metadata n’existe pas j’ai cherché mais je n’ai pas trouvé
et ma question c’est comment ajouté un craft? (je sais qu’il faut faire this.addRecipe dans la classe TutorielCraftingManager) mais je sais pas comment géré cela
-
- c’est stack1.getItemDamage.
- pareil, c’est getItemDamage, je changerais le tuto pour la 1.8.9.
- regarde le résultat, j’ai ajouté 3 craft, ça fonctionne comme avec le GameRegistry.addRecipe
Envoyé de mon RAINBOW LITE 4G en utilisant Tapatalk
-
Re ^^
Merci de ton aide après avoir tout fait j’était tellement précipité pour la testéJ’arrive dans mon monde solo et la je me give la table custom et je tente de me la givé et suspect rien ne se passe
J’ai essaye de revoir le tuto mais je ne vois pas mon érreur je pense que cela viens d’une certaine classe mais je ne sais pas la quelledonc je te l’ai passe tous x)
block
http://pastebin.com/Vb4Rf3Nvcontainer
http://pastebin.com/4UzxzZiZslot
http://pastebin.com/J7LDKtRLgui
http://pastebin.com/u4ECnZwQCraftingManager
http://pastebin.com/bJtDiNEjTutorielShapelessRecipe
http://pastebin.com/RiSzNbNSMerci de ton aide et merci beacuoup pour ton tuto
-
Tu veux dire que tu ne reçois pas le block ? Tu l’as bien enregistré avec le game registry ? Passe ta classe principale.
PS : si tu ajoutes tes recettes via le constructeur, tu n’as pass besoin du “TutorielCraftingManager.getInstance().” devant chaque addRecipe. -
@‘AymericRed’:
Tu veux dire que tu ne reçois pas le block ? Tu l’as bien enregistré avec le game registry ? Passe ta classe principale.
PS : si tu ajoutes tes recettes via le constructeur, tu n’as pass besoin du “TutorielCraftingManager.getInstance().” devant chaque addRecipe.Non au faite quand je fais clique droit dessus cela ne marche pas
j’ai oublié le gui halnder
http://pastebin.com/t29G6Qsqet de ma classe
BlockAnvilDragon = new BlockAnvilDragon(); GameRegistry.registerBlock(BlockAnvilDragon, "BlockAnvilDragon");
-
Bizarre… mets un System.out.println dans ta fonction onBlockActivated et dans ton GuiHandler, si ce n’est pas appelé, mets un @Override au deussus de la fonction.
-
Merci je l’ai system.out et tu simplement quand je fais clique droit cela ne fait rien je vais regardé dans la classe de la table de craft pour voir
Edit:j’ai trouvé as p_149727_5_.displayGUIWorkbench(p_149727_2_, p_149727_3_, p_149727_4_); le problème est que p_149727_5_ est le player en gros nommé c’est sa
player.displayGUIWorkbench(x, y, z);
et pour le @Override je l’avais déjà mis -
Oui mais cela ne va pas ouvrir ton gui. Est-ce que le println de onBlockActivated est bien appelé au moins ? Et pout le @Override, en tout cas il n’est pas sur le pastebin de ton block.
-
ha ok
J’avais pas compris ^^ et
Au faite pour le @Override je pensé que tu parlé pour le gui Handler
Au final j’ai réussi à le méttre mais sa me fait un crash
-
Tu as modifié la classe TutorielShapedRecipes (à part retirer getRemainingItems) ? Il y a un problème ligne 61, montre la classe si tu trouves pas.
-
ma classe x)
mais au faite j’ai modifié pas mal de chose car elles sont pas disponible en 1.7.10
Merci de ton aide
-
for (int i = 0; i <= this.recipeWidth - this.recipeWidth; ++i) { for (int j = 0; j <= ((IBlockAccess) inv).getHeight() - this.recipeHeight; ++j)//Ligne 61 {
Première ligne : remplace le premier this.recipeWidth par inv.width (ou getWidth()) sinon ça ne marchera pas.
Troisième ligne : whhaaatttt ?? Et eclipse est d’accord ? IBlockAccess et InventoryCrafting sont totalement différent, je ne comprends pas ce qui t’a fait mettre ça… remplace par la même chose que la première ligne, mais cette fois ci avec height et pas width. -
Re
Excuse j’avais pas vu ton commentaire x).
Donc j’ai essaye de [font=Ubuntu, sans-serif inv.width (ou getWidth()) mais pourquoi cela n’existe pas (peut être ma version de forge )]
[font=Ubuntu, sans-serifJe voudrais te remercié de m’avoir suivis pour passé le code de 1.8 ou 1.9 à 1.7.10][size=small ][size=small:)]
-
Alors c’est que les variables ne sont pas visibles, tu dois remplacer par les variables de largeur (width) et hauteur (height) de craft que tu as dans ton Container, le seul truc est que si tu as une autre table avec une taille de craft différente, tu devras refaire les classes de recette.
-
Comme cela?
package ed.enderdeath.mod.AnvilDragon; import java.util.ArrayList; import java.util.List; import com.google.common.collect.Lists; import net.minecraft.inventory.InventoryCrafting; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipe; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.ForgeHooks; import net.minecraftforge.oredict.OreDictionary; public class TutorielShapedRecipes implements IRecipe { /** How many horizontal slots this recipe is wide. */ public final int recipeWidth; /** How many vertical slots this recipe uses. */ public final int recipeHeight; /** Is a array of ItemStack that composes the recipe. */ public final Object[] recipeItems; /** Is the ItemStack that you get when craft the recipe. */ private final ItemStack recipeOutput; private boolean copyIngredientNBT; private ContainerDragonAnvil con; public TutorielShapedRecipes(int width, int height, Object[] items, ItemStack output) { this.recipeWidth = width; this.recipeHeight = height; this.recipeItems = items; this.recipeOutput = output; } public ItemStack getRecipeOutput() { return this.recipeOutput; } public ItemStack[] getRemainingItems(InventoryCrafting inv) { ItemStack[] aitemstack = new ItemStack[inv.getSizeInventory()]; for (int i = 0; i < aitemstack.length; ++i) { ItemStack itemstack = inv.getStackInSlot(i); aitemstack* = recipeOutput.getItem().getContainerItem(recipeOutput); } return aitemstack; } /** * Used to check if a recipe matches current crafting inventory * Retourne true si la recette correspond à la matrice donnée (le craft que le joueur a fait) */ public boolean matches(InventoryCrafting inv, World worldIn) { for (int i = 0; i <= con.craftWidth - this.recipeWidth; ++i) { for (int j = 0; j <= con.craftHeigth - this.recipeHeight; ++j) { if (this.checkMatch(inv, i, j, true)) { return true; } if (this.checkMatch(inv, i, j, false)) { return true; } } } return false; } /** * Checks if the region of a crafting inventory is match for the recipe. * Compare deux parties du craft */ private boolean checkMatch(InventoryCrafting inv, int regionX, int regionY, boolean mirror) { for (int x = 0 ; x < con.craftWidth ; ++x) { for (int y = 0 ; y < con.craftHeigth ; ++y) { int x1 = x - regionX; int y1 = y - regionY; Object patternStack = null; if (x1 >= 0 && y1 >= 0 && x1 < this.recipeWidth && y1 < this.recipeHeight) { if (mirror) patternStack = this.recipeItems[this.recipeWidth - x1 - 1 + y1 * this.recipeWidth]; else patternStack = this.recipeItems[x1 + y1 * this.recipeWidth]; if(patternStack instanceof String) { List <itemstack>stacks = OreDictionary.getOres((String) patternStack); boolean matches = false; for(ItemStack stack : stacks) { if(areItemStacksEquals(stack, inv.getStackInRowAndColumn(x, y))) //If the pattern's stack doesn't match with the stack in the inv crafting { matches = true; } } if(!matches) return false; } else if(!areItemStacksEquals((ItemStack) patternStack, inv.getStackInRowAndColumn(x, y))) { return false; } } } } return true; } /** * Compare les deux stacks */ public static boolean areItemStacksEquals(ItemStack stack1, ItemStack stack2) { if(stack1 == null || stack2 == null) return stack1 == stack2; return stack1.getItem() == stack2.getItem() && (stack1.getItemDamage() == OreDictionary.WILDCARD_VALUE || stack1.getItemDamage() == stack2.getItemDamage()); } /** * Returns an Item that is the result of this recipe */ public ItemStack getCraftingResult(InventoryCrafting inv) { ItemStack itemstack = this.getRecipeOutput().copy(); if (this.copyIngredientNBT) { for (int i = 0; i < inv.getSizeInventory(); ++i) { ItemStack itemstack1 = inv.getStackInSlot(i); if (itemstack1 != null && itemstack1.hasTagCompound()) { itemstack.setTagCompound((NBTTagCompound)itemstack1.getTagCompound().copy()); } } } return itemstack; } /** * Returns the size of the recipe area */ public int getRecipeSize() { return this.recipeWidth * this.recipeHeight; } /** * Set this crafting recipe to copy the NBT tag compound of the last ItemStack that has one in the crafting table. */ public TutorielShapedRecipes setCopyIngredientNBT() { this.copyIngredientNBT = true; return this; } } ```</itemstack>
-
“con” des insultes même dans le code ^^
Oui c’est ça mais tétais pas obligé de créer une variable, d’ailleurs il faut que tu l’initialises.Envoyé de mon RAINBOW LITE 4G en utilisant Tapatalk
-
@‘AymericRed’:
“con” des insultes même dans le code ^^
Oui c’est ça mais tétais pas obligé de créer une variable, d’ailleurs il faut que tu l’initialises.Envoyé de mon RAINBOW LITE 4G en utilisant Tapatalk
xD je te jure j’ai pas fait exprès
Je vais l’initialises la variable tout de suite :)___et pour la variable je peux directement la mettre dans la classe TutorielShapedRecipes???