Résolu 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
-
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.
-
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 .
-
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; } }
-
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 traceRaymerci !