Non résolu 1.12.X Créer un craft avec des résidu dans la grille de craft
-
Bonjour, j’aimerai créer un craft en 1.12 où on utilise un sceau de lait mais j’aimerais que une fois le craft fait il reste dans la grille de craft un sceau vide a la place du sceau de lait.
Je n’ai pas trouvé comment faire. Merci de bien vouloir m’aider -
Bonjour,
Il n’y a rien de spécial à faire, il faut juste faire ta recette utilisant le seau de lait comme toutes les autres.
Le saut de lait à comme container item le seau vide, donc ce dernier est renvoyé lorsqu’il est utilisé dans une recette.
-
Ok merci
-
Bonjour, comment peut-on faire pour qu’un item ne soit pas consommé lors d’un craft ou d’une action (comme poser un bloc avec un
ItemBlock
) ?
Je sais que c’est un topic en 1.12 mais vu qu’on a deja posé la question j’aimerais connaitre la réponse en 1.13.2Merci de vos réponses
-
Bonsoir,
Il aurait été quand même mieux de créer une nouvelle discussion.Dans ton
Item.Properties
il faut ajoutercontainerItem(item à renvoyer)
et l’item indiqué sera rendu lors de l’utilisation dans une recette.
Pour qu’il ne soit pas consommé lors de la pause du bloc il faut faire créer une nouvelle classe qui étant d’ItemBlock
et reprendre la fonctiontryPlace
à l’identique, à l’exception duitemstack.shrink(1);
. -
Sinon en regardant du côté du craft du gâteau ?
-
ReBonjour, j’ai repris la fonction
tryPlace
en mettantitemstack.shrink(0);
malheureusement cela ne fait rien, mon item est toujours consommé lors de la pose du bloc.
De plus je me suis rendu compte que je ne sais comment changer les loot des blocs pour que mon bloc ne drop rien en étant cassé.
Concernant lecontainerItem
mon item étant unItemBlock
il n’est pas accepté par lecontainerItem
.
(le gâteau se craft avec un seau de lait qui est déjà uncontainerItem
donc c’est comme ce qu’a dit Robin au début)(désolé pour l’envahissement du topic, la prochaine fois j’en créerais un nouveau c’est juste que là c’était l’occasion )
Merci de vos réponses
-
Fais voir le code de ton item bloc ainsi que le code de l’enregistrement de ce dernier.
ItemBlock hérite d’item, il n’y a pas de raison que tu ne puisses pas l’utiliser dans containerItem.
Et enfin pour supprimer le drop c’est il faut ajouter cette méthode dans la classe du bloc :
@Override public IItemProvider getItemDropped(IBlockState state, World worldIn, BlockPos pos, int fortune) { return Items.AIR; }
-
l’
ItemBlock
:package dev.mff.mod1.common.block; import net.minecraft.advancements.CriteriaTriggers; import net.minecraft.block.Block; import net.minecraft.block.SoundType; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.BlockItemUseContext; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumActionResult; import net.minecraft.util.SoundCategory; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; public class Constructing_Block extends ItemBlock { public Constructing_Block(Block blockIn, Properties builder) { super(blockIn, builder); // TODO Auto-generated constructor stub } public EnumActionResult TryPlace(BlockItemUseContext p_195942_1_) { if (!p_195942_1_.canPlace()) { return EnumActionResult.FAIL; } else { IBlockState iblockstate = this.getStateForPlacement(p_195942_1_); if (iblockstate == null) { return EnumActionResult.FAIL; } else if (!this.placeBlock(p_195942_1_, iblockstate)) { return EnumActionResult.FAIL; } else { BlockPos blockpos = p_195942_1_.getPos(); World world = p_195942_1_.getWorld(); EntityPlayer entityplayer = p_195942_1_.getPlayer(); ItemStack itemstack = p_195942_1_.getItem(); IBlockState iblockstate1 = world.getBlockState(blockpos); Block block = iblockstate1.getBlock(); if (block == iblockstate.getBlock()) { this.onBlockPlaced(blockpos, world, entityplayer, itemstack, iblockstate1); block.onBlockPlacedBy(world, blockpos, iblockstate1, entityplayer, itemstack); if (entityplayer instanceof EntityPlayerMP) { CriteriaTriggers.PLACED_BLOCK.trigger((EntityPlayerMP)entityplayer, blockpos, itemstack); } } SoundType soundtype = iblockstate1.getSoundType(world, blockpos, p_195942_1_.getPlayer()); world.playSound(entityplayer, blockpos, soundtype.getPlaceSound(), SoundCategory.BLOCKS, (soundtype.getVolume() + 1.0F) / 2.0F, soundtype.getPitch() * 0.8F); itemstack.shrink(0); return EnumActionResult.SUCCESS; } } } }
la classe des blocs et ItemBlocks :
package dev.mff.mod1; import dev.mff.mod1.common.block.Constructing_Block; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.registries.ObjectHolder; @Mod.EventBusSubscriber(modid = Refs.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD) public class ModBlocks { @ObjectHolder(Refs.MOD_ID + ":test_block") public static final Block TEST_BLOCK = null; @ObjectHolder(Refs.MOD_ID + ":constructing_block") public static final Block CONSTRUCTING_BLOCK = null; @SubscribeEvent public static void registerBlock(final RegistryEvent.Register<Block> event) { event.getRegistry().register(new Block(Block.Properties.create(Material.GROUND).hardnessAndResistance(0.1F, 1200F)).setRegistryName("test_block")); event.getRegistry().register(new Block(Block.Properties.create(Material.GROUND).hardnessAndResistance(0.1F, 1200F)).setRegistryName("constructing_block")); } @SubscribeEvent public static void registerItem(final RegistryEvent.Register<Item> event) { event.getRegistry().register(new ItemBlock(TEST_BLOCK, new Item.Properties().group(Mod1.MOD_GROUP)).setRegistryName(TEST_BLOCK.getRegistryName())); event.getRegistry().register(new Constructing_Block(CONSTRUCTING_BLOCK, new Item.Properties().containerItem(null).group(Mod1.MOD_GROUP)).setRegistryName(CONSTRUCTING_BLOCK.getRegistryName())); } }
(j’ai mis
null
du coup pour pas que cela produise des erreurs) -
Sur la ligne d’enregistrement de ton item block, ici :
event.getRegistry().register(new ItemBlock(TEST_BLOCK, new Item.Properties().group(Mod1.MOD_GROUP)).setRegistryName(TEST_BLOCK.getRegistryName()));
Il faut remplacer ItemBlock par ta classe Constructing_Block sinon forcement elle n’a aucun effet (et il aurait été mieux de nommer cette dernière ItemConstructingBlock pour que son nom reflète bien ce qu’elle est : un Item).
-
Mais je l’ai déjà fais ça c’est sur la deuxième ligne, la première c’est un autre bloc
event.getRegistry().register(new Constructing_Block(CONSTRUCTING_BLOCK, new Item.Properties().containerItem(null).group(Mod1.MOD_GROUP)).setRegistryName(CONSTRUCTING_BLOCK.getRegistryName()));
-
Ah autant pour moi, j’ai mal lu le code x)
En fait le problème vient de la méthode TryPlace, cela devrait être tryPlace (les méthodes ne commencent jamais avec une majuscule en java).
Ajoutes un @Override au dessus, ça t’évitera ce genre de problème à l’avenir. -
Apparemment moi j’avais mal recopié xd
letryPlace
fonctionne par contre pour legetItemDropped
éclipse met une erreur lorsque je met@Override
, il dit “The method getItemDropped(IBlockState, World, BlockPos, int) of type Constructing_Block must override or implement a supertype method” et me demande de l’enlever -
Car c’est pas la bonne définition dans la classe mère.
Petite question, as-tu les bases (voire un peu plus) en java?
-
J’ai lu le tuto des bases en java et je comprend quelques trucs.
Je pourrais savoir ce qui ne va pas avec l’Override ?
-
c’est pas l’override le problème, c’est le prototype de ta fonction. Va voir dans la classe mère les bon arguments de la fonction / si c’est le bon nom de fonction
-
La fonction c’est Robin qui me l’a donné, et je ne sais pas trop comment je peux trouver la classe mère
-
Elle doit être mit dans la classe du bloc, pas dans la classe de l’itemblock.
-
Je suis vraiment débile des fois, tu l’avais déjà marqué en plus
Edit : merci pour votre aide du coup cela fontionne