Créer une table de craft compatible avec JEI et NEI
-
Déjà gg AymericRed et merci beaucoup à toi pour ce tuto grâce à toi je vais réalisé ce que j’ai voulu faire il à longtemps

après en bonus tu pourra rajouté
NEI,de décraft les objet qu’on on a craft du genre je craft une épée spécial avec 1 stick et 8 diamand et par rapport à sa durabilité par exemple si il est à 200 on récupéré 2 diamantMerci infiniment pour ce tuto

Edit
comme je pourrais mettre ceci@Override public boolean canInteractWith(EntityPlayer player) { return this.worldObj.getBlockState(this.pos).getBlock() != enderdeath.AnvilDragon ? false : player.getDistanceSq((double)this.pos.getX() + 0.5D, (double)this.pos.getY() + 0.5D, (double)this.pos.getZ() + 0.5D) <= 64.0D; }en 1.7.10?
-
De rien

Donc du coup NEI c’est prévu, et pour ta proposition, il suffit d’ajouter les crafts mais en inversé. -
@‘AymericRed’:
De rien

Donc du coup NEI c’est prévu, et pour ta proposition, il suffit d’ajouter les crafts mais en inversé.Merci grace à toi j’ai fait ma nouvelle table de craft dans mon mod en 1.9 et je m’attaque pour une nouvelle table de craft pour mon mod en 1.7.10

(sa va je pensé que c’était plus dur de passé du codage 1.9 en 1.7.10 mais c’est bon ^^)
et pour NEI Yes
et pour les craft inversé je vais m’y mettre après la nouvelle table de craft en 1.7.10
Merci beaucoup

Ps ce tuto = 5 étoiles

Edit comme je peux passé ceci
@Override public boolean canInteractWith(EntityPlayer player) { return this.worldObj.getBlockState(this.pos).getBlock() != enderdeath.AnvilDragon ? false : player.getDistanceSq((double)this.pos.getX() + 0.5D, (double)this.pos.getY() + 0.5D, (double)this.pos.getZ() + 0.5D) <= 64.0D; }en 1.7.10
-
getBlockState(…).getBlock() devient getBlock et ensuite il faut que tu fasses trois variables pour X, y, et z.
Envoyé de mon RAINBOW LITE 4G en utilisant Tapatalk
-
J’ai un autre problème dans cette classe
package ed.enderdeath.mod.AnvilDragon; import com.sun.istack.internal.Nullable; import cpw.mods.fml.common.FMLCommonHandler; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.InventoryCrafting; import net.minecraft.inventory.Slot; import net.minecraft.item.Item; import net.minecraft.item.ItemHoe; import net.minecraft.item.ItemPickaxe; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemSword; import net.minecraft.stats.AchievementList; import net.minecraftforge.common.ForgeHooks; public class DragonSlotCrafting extends Slot { /** The craft matrix inventory linked to this result slot. */ private final InventoryCrafting craftMatrix; /** The player that is using the GUI where this slot resides. */ private final EntityPlayer thePlayer; /** The number of items that have been crafted so far. Gets passed to ItemStack.onCrafting before being reset. */ private int amountCrafted; public DragonSlotCrafting(EntityPlayer player, InventoryCrafting craftingInventory, IInventory inventoryIn, int slotIndex, int xPosition, int yPosition) { super(inventoryIn, slotIndex, xPosition, yPosition); this.thePlayer = player; this.craftMatrix = craftingInventory; } /** * Check if the stack is a valid item for this slot. Always true beside for the armor slots. */ @Override public boolean isItemValid(@Nullable ItemStack stack) { return false; } /** * Decrease the size of the stack in slot (first int arg) by the amount of the second int arg. Returns the new * stack. */ @Override public ItemStack decrStackSize(int amount) { if (this.getHasStack()) { this.amountCrafted += Math.min(amount, this.getStack().stackSize); } return super.decrStackSize(amount); } /** * the itemStack passed in is the output - ie, iron ingots, and pickaxes, not ore and wood. Typically increases an * internal count then calls onCrafting(item). */ @Override protected void onCrafting(ItemStack stack, int amount) { this.amountCrafted += amount; this.onCrafting(stack); } /** * Appelé quand on craft, permet de gérer les achievements */ @Override protected void onCrafting(ItemStack stack) { if (this.amountCrafted > 0) { stack.onCrafting(this.thePlayer.worldObj, this.thePlayer, this.amountCrafted); } this.amountCrafted = 0; if (stack.getItem() == Item.getItemFromBlock(Blocks.bookshelf)) { this.thePlayer.addStat(AchievementList.bookcase, 1); } } /** * Appelée quand le joueur retire l'item du slot, permet de retirer le composants utilisés pour le craft */ @Override public void onPickupFromSlot(EntityPlayer playerIn, ItemStack stack) { FMLCommonHandler.instance().firePlayerCraftingEvent(playerIn, stack, craftMatrix); //Distribue l'event de craft this.onCrafting(stack); //Gestion des achievements ForgeHooks.setCraftingPlayer(playerIn); //Utilisé afin de retirer les items utiliser (pas sur de cela) ItemStack[] aitemstack = TutorielCraftingManager.getInstance().getRemainingItems(this.craftMatrix, playerIn.worldObj); //On récupère les items restants ForgeHooks.setCraftingPlayer(null); for (int i = 0; i < aitemstack.length; ++i) //On actualise les slots de craft { ItemStack itemstack = this.craftMatrix.getStackInSlot(i); ItemStack itemstack1 = aitemstack*; if (itemstack != null) { this.craftMatrix.decrStackSize(i, 1); itemstack = this.craftMatrix.getStackInSlot(i); } if (itemstack1 != null) { if (itemstack == null) { this.craftMatrix.setInventorySlotContents(i, itemstack1); } else if (ItemStack.areItemStacksEqual(itemstack, itemstack1) && ItemStack.areItemStackTagsEqual(itemstack, itemstack1)) { itemstack1.stackSize += itemstack.stackSize; this.craftMatrix.setInventorySlotContents(i, itemstack1); } else if (!this.thePlayer.inventory.addItemStackToInventory(itemstack1)) { this.thePlayer.dropOneItem(false); } } } } }Le problème c’est que setCraftingPlayer n’existe pas donc j’ai éssayé de trouve une alternative mais j’ai pas trouvé
-
Pour le slot, je regarde tout à l’heure, pour le gui, ça devrait marcher mais retire xSize1 et ySize1, c’est totalement inutile.
EDIT : PS : Tu peux regarder dans la classe SlotCrafting de mc qui est comparable à celle du tuto.
Envoyé de mon RAINBOW LITE 4G en utilisant Tapatalk
-
Merci beaucoup

Mais j’ai un autre problème
return irecipe.getRemainingItems(craftMatrix); //On retourne les items restantsgetRemainingItems(craftMatrix); ``` n'existe pas j'ai essaye de trouvé un internative mais cela ne marche pas ): Merci de ta réponse :) -
Essaye un icrecipe.func_quelquechose qui retourne la même chose (array de stack) et qui a un InventoryCrafting en paramètre.
-
c’est à dire il na pas de func dans la classe IRecipe et pour moi les seul truc que j’ai son :
getCraftingResult
matches
getRecipeSize
plus précisément
boolean matches(InventoryCrafting p_77569_1_, World p_77569_2_);
ItemStack getCraftingResult(InventoryCrafting p_77572_1_);
int getRecipeSize();
après c’est peut être ma version de forge

Merci de ta réponse rapide

-
Ah bon, je pensait qu’il y aurait ça en 1.7.10, ça doit fonctionner autrement, il faut regarder le SlotCrafting de Minecraft pour voir comment est-ce qu’il fait.
-
Quelques updates du tuto ont été réalisées :
- Modification du code du Container, changement des variables craftWidth et craftHeigth de private à public et ajout de “final” aux différents variables.
- Rédaction de la partie “Faire une table de craft qui ne pert pas ses items” terminée.
Le bonus sur NEI arrivera quand NEI en 1.9.4 existera

-
@‘AymericRed’:
Quelques updates du tuto ont été réalisées :
- Modification du code du Container, changement des variables craftWidth et craftHeigth de private à public et ajout de “final” aux différents variables.
- Rédaction de la partie “Faire une table de craft qui ne pert pas ses items” terminée.
Le bonus sur NEI arrivera quand NEI en 1.9.4 existera

Bravo sa complète ce tutoriel très bon

Bonne chance pour NEI

Pour revenir à mon problème après plusieurs recherche je n’ai pas trouvé peut être que je devrais cherché dans la classe qui gère les crafts
Merci de complété ce tutoriel qui est déjà très bon et de ton aide

-
Merci du compliment ^^ Je regarderais cet aprem dans les sources 1.7 que je devrais toujours avoir, pour ton problème

Envoyé de mon RAINBOW LITE 4G en utilisant Tapatalk
-
Si c’est ce que je pense, avant la 1.8 c’était une autre méthode qui était utilisée : on configurait l’item qui restait depuis l’item et non depuis le craft, ça a du être modifié dans les dernières versions. Peut être qu’en retirant cette partie là ça fonctionnera (à vérifier)
-
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.
-
@‘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