1.13.2 un item qui pose un bloc



  • Bonjour,
    je voulais créer un item qui permet de poser des blocs avec un clic droit mais éclipse m'indique des erreurs et je ne sais pas comment les résoudre.

    Voici la classe de l'item :

    package dev.mff.mod1.common.item;
    
    import dev.mff.mod1.ModBlocks;
    import net.minecraft.block.Block;
    import net.minecraft.block.BlockBush;
    import net.minecraft.block.state.BlockState;
    import net.minecraft.block.state.IBlockState;
    import net.minecraft.init.Blocks;
    import net.minecraft.item.Item;
    import net.minecraft.item.ItemUseContext;
    import net.minecraft.util.EnumActionResult;
    import net.minecraft.util.EnumFacing;
    import net.minecraft.util.math.BlockPos;
    import net.minecraft.world.World;
    import net.minecraftforge.eventbus.api.SubscribeEvent;
    import static net.minecraft.util.EnumFacing.*;
    
    public class ConstructingGlove extends Item {
    
    	public ConstructingGlove(Properties properties) {
    		super(properties);}
    		@SubscribeEvent
    		public EnumActionResult onItemUse(ItemUseContext useContext) {
    			BlockPos blockpos = useContext.getPos();
    			int x = blockpos.getX();
    			int y = blockpos.getY();
    			int z = blockpos.getZ();
    			World world = useContext.getWorld();
    			IBlockState iblockstate = world.getBlockState(blockpos);
    			
    			IBlockState testblock_state = ModBlocks.TEST_BLOCK.getDefaultState();
    			
    			BlockPos up_pos = new BlockPos(x, y + 1, z);
    			if (isBlockAIR(up_pos)) {
    				world.setBlockState(blockpos, testblock_state);
    
    			} else {
    				switch (this.getEnumFacing()) {
    				case EAST:
    					BlockPos east_pos = new BlockPos(x + 1, y, z);
    					if (isBlockAIR(east_pos)) {
    						world.setBlockState(east_pos, testblock_state);
    						break;
    					}
    				case WEST:
    					BlockPos west_pos = new BlockPos(x - 1, y, z);
    					if (isBlockAIR(west_pos)) {
    						world.setBlockState(west_pos, testblock_state);
    						break;
    					}
    				case NORTH:
    					BlockPos north_pos = new BlockPos(x, y, z + 1);
    					if (isBlockAIR(north_pos)) {
    						world.setBlockState(north_pos, testblock_state);
    						break;
    					}
    				case SOUTH:
    					BlockPos south_pos = new BlockPos(x, y, z - 1);
    					if (isBlockAIR(south_pos)) {
    						world.setBlockState(south_pos, testblock_state);
    						break;
    					}
    				case DOWN:
    					BlockPos down_pos = new BlockPos(x, y - 1, z);
    					if (isBlockAIR(down_pos)) {
    						world.setBlockState(down_pos, testblock_state);
    						break;
    					}
    				}
    			}
    			
    			
    			return EnumActionResult.SUCCESS;
    			
    	}
    		private boolean isBlockAIR(BlockPos pos) {
    		
    			Block getBlock = this.world.getBlockState(pos).getBlock();
    			if (getBlock instanceof BlockBush) return true;
    			Block[] a = {Blocks.CAVE_AIR, Blocks.AIR, Blocks.SNOW, Blocks.VINE};
    			for (Block target : a) {
    				if (getBlock == target) return true;
    			}
    			return false;
    		}
    }
    
    

    Les erreurs (les morceau soulignés en rouge) que éclipse m'indique sont :

    • this.getEnumFacing()
    • this.world.getBlockState(pos).getBlock()

    Pour résoudre mon problème je pense qu'il me faudrait quelque chose qui puisse m'indiquer sur quelle face du bloc je clic pour ensuite faire fonctionner le switch. Malheureusement je ne sais pas comment faire.

    Merci de vos réponses
    🙂


  • Moddeurs confirmés Rédacteurs

    Salut,
    Ce que tu cherches à faire existe déjà dans Minecraft. En effet, tous les "blocs" que tu tiens dans ta main sont en réalité des objets qui ont comme comportement de placer dans le monde le bloc leur correspondant.
    Ainsi, une classe possédant ce comportement existe déjà, elle s'appelle ItemBlock. Tu dois certainement être capable de faire ce que tu veux en utilisant cette classe. Si tu veux que l'item qui pose le bloc ai une texture et un modèle différent que celui du bloc qu'il pose alors c'est totalement possible sans modifier la classe ItemBlock.

    N'hésite pas à demander comment faire certaines choses avant de copier/coller la classe ItemBlock pour faire ce tu souhaites.



  • Tout d'abord merci de ton aide,

    il est vrai que j’avais essayé de copier/coller la classe ItemBlock mais il y avait encore plus d'erreurs donc j'ai abandonné.

    De plus je n'avais pas pensé a faire extends ItemBlock a mon item, pour moi un item était forcément extends Item.

    Malheureusement mon problème n'est pas résolu puisque je ne sais pas comment connaitre les paramètres que je peut modifier dans le constructeur en faisant extends ItemBlock, et je ne sais pas non plus comment les modifier.
    J'aimerais savoir comment, toi et les autres, vous faites pour connaitre ces informations, cela me sera utile pour la suite.

    Merci d'avance 🙂



  • Rebonjour, je n'arrive pas a trouver de solution a mon problème 😞 car tout ce que je fais provoque des crashs et je ne sais pas comment faire pour choisir quel bloc on pose avec l'item.
    De plus je ne sais pas si on peut changer le fait que l'item soit consommé lors de son activation, donc je me demande si l'ItemBlock est une bonne idée.

    J'espère que vous pourrez me répondre car là je suis coincé 😞


Log in to reply