Plusieurs questions



  • Bonsoir,

    Mes questions:

    Est-il possible de faire un cooldown avec le rightclick je m'explique:

    Par exemple dans se cas lorsque je fais un simple clic droit sur un bloc de bedrock il se change en un bloc "block1" de mon mod est-il possible de mettre un temps par exemple le joueur doit resté cliqué pendant 5 secondes pour que le bloc change et pas en faisant un simple clic droit ( je sais pas si vous me suivez sinon dites le moi)

    @SubscribeEvent
    public void onInteract3(PlayerInteractEvent e) {
    if(!e.world.isRemote) {
    ItemStack stack = e.entityPlayer.getHeldItem();
    if(stack != null && stack.getItem() == CSCItems.balai && e.action == Action.RIGHT_CLICK_BLOCK) {
    BlockPos pos = e.pos;
    IBlockState state = e.world.getBlockState(pos);
    if(state.getBlock() == Blocks.bedrock) {
    
    e.world.setBlockState(new BlockPos(pos.getX(), pos.getY(), pos.getZ()), CSCBlocks.block1.getDefaultState());
    
    }
    }
    }
    
    }
    
    

    J'ai une autres question aussi:

    Avec ce code j'ai une chance sur 4 de faire spawn une enclume sur mon bloc de bedrock.
    (On revient a l'event juste au dessus)
    Je voudrais faire en sorte de pouvoir changer mon bloc de bedrock en bloc "block1" seulement quand l'enclume a était enlever .
    Faire en sorte que si l'encule est encore sur mon bloc de bedrock l'event au dessus est alors impossible.

    
    public class block1 extends Block {
    
    protected block1(Material materialIn) {
    super(materialIn);
    this.setTickRandomly(true);
    }
    
        public int tickRate(World worldIn)
        {
            return 900 * 20;
        }
    
        public void updateTick(World world, BlockPos pos, IBlockState state, Random rand) 
        {
        world.scheduleUpdate(pos, this, this.tickRate(world));
    world.setBlockState(new BlockPos(pos.getX(), pos.getY(), pos.getZ()), Blocks.bedrock.getDefaultState());
    
    if(world.rand.nextInt(4) == 0) // une chance sur 4
    {
    world.setBlockState(new BlockPos(pos.getX(), pos.getY() + 1, pos.getZ()), Blocks.anvil.getDefaultState());
    }
    }
    
        public void onBlockAdded(World worldIn, BlockPos pos, IBlockState state) 
        {
        worldIn.scheduleUpdate(pos, this, this.tickRate(worldIn));
        }
    
    }
    
    

    Est ce que mes question sont-elle possible ? Si oui comment procédé !

    Merci 🙂



  • "Est ce que mes question sont-elle possible ?"

    N'oublies jamais que tout est possible ^^ ! (à condition d'être déterminé)

    Pour ta première question:

    Si j'étais toi je regarderai les fonctions de Block.class de ta version de Minecraft, soit tu y trouveras directement ce dont tu as besoin ou un event appeller à chaque tick, à chaque tick tu peux checker si le joueur interragit avec le bloc 😉

    Pour ta seconde question:

    Euh si j'ai bien compris ta demande est plutôt simple

    "Je voudrais faire en sorte de pouvoir changer mon bloc de bedrock en bloc "block1" seulement quand l'enclume a était enlever .
    Faire en sorte que si l'encule est encore sur mon bloc de bedrock l'event au dessus est alors impossible."

    if(world.getBlock(x, y + 1, z) != Block.anvil)
    //tonCodeDeTonEvent
    

  • Administrateurs

    Pour les délais sur le clic droit, il y a la nourriture, l'arc, etc …
    Suffit de s'inspirer du code. (setItemInUse / onItemUse / etc ...).



  • @'Benjamin Loison':

    "Est ce que mes question sont-elle possible ?"

    N'oublies jamais que tout est possible ^^ ! (à condition d'être déterminé)

    Pour ta première question:

    Si j'étais toi je regarderai les fonctions de Block.class de ta version de Minecraft, soit tu y trouveras directement ce dont tu as besoin ou un event appeller à chaque tick, à chaque tick tu peux checker si le joueur interragit avec le bloc 😉

    Pour ta seconde question:

    Euh si j'ai bien compris ta demande est plutôt simple

    "Je voudrais faire en sorte de pouvoir changer mon bloc de bedrock en bloc "block1" seulement quand l'enclume a était enlever .
    Faire en sorte que si l'encule est encore sur mon bloc de bedrock l'event au dessus est alors impossible."

    if(world.getBlock(x, y + 1, z) != Block.anvil)
       //tonCodeDeTonEvent
    

    Salut !

    D'accord merci, j'avais pas du tout pensés au if(world.getblock..) ^^

    Merci robin je vais essayer ça

    Merci à vous deux 🙂



  • Re,

    Alors merci benjamin j'ai réussis a faire se que je voulais.

    Robin, pour le onitemuse setiteminuse etc… Comment je peux faire ? car moi c'est par un event que je fais la modification du bloc pas avec la classe de l'item.


  • Administrateurs

    Faut le faire depuis la classe.
    Je ne vois rien qui te l’empêche si ?



  • Non rien,

    Alors j'ai fais ça:

    
    package com.CSC.net.item;
    
    import com.CSC.net.block.CSCBlocks;
    
    import net.minecraft.block.state.IBlockState;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.init.Blocks;
    import net.minecraft.item.EnumAction;
    import net.minecraft.item.Item;
    import net.minecraft.item.ItemStack;
    import net.minecraft.util.BlockPos;
    import net.minecraft.util.ChatComponentText;
    import net.minecraft.util.EnumChatFormatting;
    import net.minecraft.util.EnumFacing;
    import net.minecraft.world.World;
    import net.minecraftforge.event.entity.player.PlayerInteractEvent.Action;
    
    public class balai extends Item {
    
        public boolean onItemUse(ItemStack stack, EntityPlayer playerIn, World worldIn, BlockPos pos, EnumFacing side, float hitX, float hitY, float hitZ)
        {
        if(!worldIn.isRemote) {
    if(stack != null && stack.getItem() == CSCItems.balai) {
    IBlockState state = worldIn.getBlockState(pos);
    if(state.getBlock() == Blocks.bedrock && worldIn.getBlockState(new BlockPos(pos.getX(), pos.getY() + 1, pos.getZ())).getBlock() != Blocks.anvil) {
    if(stack.getItemUseAction() == EnumAction.BOW)
    worldIn.setBlockState(new BlockPos(pos.getX(), pos.getY(), pos.getZ()), CSCBlocks.block1.getDefaultState());
    }
    
    else if(worldIn.getBlockState(new BlockPos(pos.getX(), pos.getY() + 1, pos.getZ())).getBlock() == Blocks.anvil)
    {
    playerIn.addChatMessage(new ChatComponentText("Vous ne pouvez pas néttoyez ce bloc car il y a une poubelle dessus, enlevez d'abord la poubelle avant de néttoyer ce bloc !"));
    }
    else
    {
    playerIn.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Action impossible."));
    }
    
    }
    }
    
            return false;
        }
    
        public EnumAction getItemUseAction(ItemStack stack)
        {
            return EnumAction.BOW;
        }
    
    }
    
    

    Mais toujours pas de cooldown je clique une fois le bloc se change direct .


  • Administrateurs

        public int getMaxItemUseDuration(ItemStack stack)
        {
            return 32; // durée
        }
    
        public EnumAction getItemUseAction(ItemStack stack)
        {
            return EnumAction.EAT; // type d'animation
        }
    
        public ItemStack onItemRightClick(ItemStack itemStackIn, World worldIn, EntityPlayer playerIn)
        {
            playerIn.setItemInUse(itemStackIn, this.getMaxItemUseDuration(itemStackIn)); // met l'item en utilisation
            return itemStackIn;
        }
    
        public ItemStack onItemUseFinish(ItemStack stack, World worldIn, EntityPlayer playerIn)
        {
            // ton action à la fin du temps
    
            return stack;
        }
    


  • Y'a pas blockpos du coup j'ai fais comme ça mais ça marche pas:

    
    package com.CSC.net.item;
    
    import com.CSC.net.block.CSCBlocks;
    
    import net.minecraft.block.state.IBlockState;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.init.Blocks;
    import net.minecraft.item.EnumAction;
    import net.minecraft.item.Item;
    import net.minecraft.item.ItemStack;
    import net.minecraft.util.BlockPos;
    import net.minecraft.util.ChatComponentText;
    import net.minecraft.util.EnumChatFormatting;
    import net.minecraft.util.EnumFacing;
    import net.minecraft.world.World;
    import net.minecraftforge.event.entity.player.PlayerInteractEvent.Action;
    
    public class balai extends Item {
    
    private BlockPos pos2;
    
        public int getMaxItemUseDuration(ItemStack stack)
        {
            return 32; // durée
        }
    
        public EnumAction getItemUseAction(ItemStack stack)
        {
            return EnumAction.BOW; // type d'animation
        }
    
        public boolean onItemUse(ItemStack stack, EntityPlayer playerIn, World worldIn, BlockPos pos, EnumFacing side, float hitX, float hitY, float hitZ)
        {
        pos2 = pos;
            return false;
        }
    
        public ItemStack onItemRightClick(ItemStack itemStackIn, World worldIn, EntityPlayer playerIn)
        {
            playerIn.setItemInUse(itemStackIn, this.getMaxItemUseDuration(itemStackIn)); // met l'item en utilisation
            return itemStackIn;
        }
    
        public ItemStack onItemUseFinish(ItemStack stack, World worldIn, EntityPlayer playerIn)
        {
        if(!worldIn.isRemote) {
    if(stack != null && stack.getItem() == CSCItems.balai) {
    BlockPos pos = pos2;
    IBlockState state = worldIn.getBlockState(pos);
    if(state.getBlock() == CSCBlocks.block_sale && worldIn.getBlockState(new BlockPos(pos.getX(), pos.getY() + 1, pos.getZ())).getBlock() != Blocks.anvil) {
    if(stack.getItemUseAction() == EnumAction.BOW)
    worldIn.setBlockState(new BlockPos(pos.getX(), pos.getY(), pos.getZ()), CSCBlocks.block_propre.getDefaultState());
    }
    else if(worldIn.getBlockState(new BlockPos(pos.getX(), pos.getY() + 1, pos.getZ())).getBlock() == Blocks.anvil)
    {
    playerIn.addChatMessage(new ChatComponentText("Vous ne pouvez pas néttoyez ce bloc car il y a une poubelle dessus, enlevez d'abord la poubelle avant de néttoyer ce bloc !"));
    }
    else
    {
    playerIn.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Action impossible."));
    }
    }
        }
    
            return stack;
        }
    
    }
    
    

  • Administrateurs

    Non, ça ne risque pas de fonctionner …
    Pour savoir où le curseur pointe il faut faire un traceRay



  • @'robin4002':

    Non, ça ne risque pas de fonctionner …
    Pour savoir où le curseur pointe il faut faire un traceRay

    merci !