Résolu Craft avec nbt qui reste
-
Bonjour,
Je me demandais comment faire un block mais que chaque item doivent avoir un même nbt (qui peut dependre (c’est un pseudo)) et que si tout les nbt sont correcte alors on peut crafter le bloc avec le nbt correspondant.
Sachant que on ne peut integrer de nbt dans les json, j’ai voulu me penchais sur a méthode à l’ancienne avec le GameRegistery mais il n’y a plus la méthode qui permet d’enregistrer un craft, et en plus les crafts sont enregistrer au démarrage donc il n’y aurai tout simplement pas le craft en jeu. Après je me suis dis que m’orienté vers les events été la meilleur solution mais il y a que un seul event pour les recipes et je n’arrive pas à récuperer les nbt des objets de base. Donc je fais demande à vous pour pouvoir m’aider sur mon problème.
-
Alors ?
-
Les events que j’ai essayer d’utiliser sont
RecipesUpdateEvent
etPlayerEvent.ItemCraftedEvent
et rien, aidez moi svp -
up ?
-
Il n’y a personne qui veux me répondre ?
-
Je pense que tu devrais regarder du coté des crafts pour les shulkers box car elles gardent leurs items donc leurs nbts la classe s’appelle
ShulkerBoxRecipes
désolé de ne pas t’aider plus mais j’ai jamais essayé -
c’est ca le nom
ShulkerBoxColoringRecipe
, tu m’as menti -
J’avoue, je suis un peu perdu avec ceux que je dois faire,
ShulkerBoxColoringRecipe :
public class ShulkerBoxColoringRecipe extends SpecialRecipe { public ShulkerBoxColoringRecipe(ResourceLocation idIn) { super(idIn); } /** * Used to check if a recipe matches current crafting inventory */ public boolean matches(CraftingInventory inv, World worldIn) { int i = 0; int j = 0; for(int k = 0; k < inv.getSizeInventory(); ++k) { ItemStack itemstack = inv.getStackInSlot(k); if (!itemstack.isEmpty()) { if (Block.getBlockFromItem(itemstack.getItem()) instanceof ShulkerBoxBlock) { ++i; } else { if (!itemstack.getItem().isIn(net.minecraftforge.common.Tags.Items.DYES)) { return false; } ++j; } if (j > 1 || i > 1) { return false; } } } return i == 1 && j == 1; } /** * Returns an Item that is the result of this recipe */ public ItemStack getCraftingResult(CraftingInventory inv) { ItemStack itemstack = ItemStack.EMPTY; net.minecraft.item.DyeColor dyecolor = net.minecraft.item.DyeColor.WHITE; for(int i = 0; i < inv.getSizeInventory(); ++i) { ItemStack itemstack1 = inv.getStackInSlot(i); if (!itemstack1.isEmpty()) { Item item = itemstack1.getItem(); if (Block.getBlockFromItem(item) instanceof ShulkerBoxBlock) { itemstack = itemstack1; } else { net.minecraft.item.DyeColor tmp = net.minecraft.item.DyeColor.getColor(itemstack1); if (tmp != null) dyecolor = tmp; } } } ItemStack itemstack2 = ShulkerBoxBlock.getColoredItemStack(dyecolor); if (itemstack.hasTag()) { itemstack2.setTag(itemstack.getTag().copy()); } return itemstack2; } /** * Used to determine if this recipe can fit in a grid of the given width/height */ public boolean canFit(int width, int height) { return width * height >= 2; } public IRecipeSerializer<?> getSerializer() { return IRecipeSerializer.CRAFTING_SPECIAL_SHULKERBOXCOLORING; } }
et la mienne :
public class RecipePersonalBlock extends SpecialRecipe { public RecipePersonalBlock() { super(new ResourceLocation(null /* :) */)); } @Override public boolean matches(CraftingInventory inv, World worldIn) { return false; } @Override public ItemStack getCraftingResult(CraftingInventory inv) { ItemStack ingredient1 = inv.getStackInSlot(1); ItemStack ingredient2 = inv.getStackInSlot(2); ItemStack ingredient3 = inv.getStackInSlot(3); ItemStack ingredient4 = inv.getStackInSlot(4); ItemStack ingredient5 = inv.getStackInSlot(5); ItemStack ingredient6 = inv.getStackInSlot(6); ItemStack ingredient7 = inv.getStackInSlot(7); ItemStack ingredient8 = inv.getStackInSlot(8); ItemStack ingredient9 = inv.getStackInSlot(9); if (ingredient1.getTag().getString("Owner").equals(ingredient2.getTag().getString("Owner")) && ingredient2.getTag().getString("Owner").equals(ingredient3.getTag().getString("Owner")) && ingredient3.getTag().getString("Owner").equals(ingredient4.getTag().getString("Owner")) && ingredient4.getTag().getString("Owner").equals(ingredient5.getTag().getString("Owner")) && ingredient5.getTag().getString("Owner").equals(ingredient6.getTag().getString("Owner")) && ingredient6.getTag().getString("Owner").equals(ingredient7.getTag().getString("Owner")) && ingredient7.getTag().getString("Owner").equals(ingredient8.getTag().getString("Owner")) && ingredient8.getTag().getString("Owner").equals(ingredient9.getTag().getString("Owner"))) { ItemStack item = new ItemStack(Blocks.PERSONAL_BLOCK); item.getTag().putString("Owner", ingredient1.getTag().getString("Owner")); return item; } return ItemStack.EMPTY; } @Override public boolean canFit(int width, int height) { return false; /* EDIT : Je pense que ici c'est : */ return width * height >= 9; } @Override public IRecipeSerializer<?> getSerializer() { return null; // EDIT : Ici il faudra aller voir comment c'est sur IRecipeSerializer.CRAFTING_SPECIALSHULKERBOXCOLORING donc pas trop difficile } }
et si vous savez comment compacter ma vérification, ce serai cool
EDIT : en fait, il y a juste la fonction
matches
ou je ne sais pas quoi mettre donc ça va en fait -
Je pense que je peux compacter en créant la fonction :
private String ingredients(CraftingInventory inv, int slot) { return inv.getStackInSlot(slot).getTag().getString("Owner"); }
Je sais, c’est pas foufou mais c’est deja mieux
EDIT : et pour enregistrer la recette j’ai essayer (mais je sais as si c’est correcte) :
@EventBusSubscriber(modid = Main.MODID, bus = Bus.MOD) public class Recipes { @SubscribeEvent public static void registerRecipes(Register<IRecipeSerializer<?> /* Je crois que ça s'écrivait comme ça */ > event) { event.getRegistry.register(new SpecialRecipeSerializer/* Toujours pas sur du nom */<IRecipe<?>>(new RecipePersonalBlock() /*mais il y avait une erreur que je n'arrive pas à régler*/).setRegisteryName("personal_block"));
-
up ?
-
Bon j’ai décider de faire une machine à part, au moins ça règlera mon problème