Rendre un bloc destructible + vite avec un type d'outil?
-
this.setHarvestLevel(“pickaxe”, 2); <- Ceci va dans le constructeur de ta pioche.
-
Non, SuperLoup, cette fonction est bien une fonction de la classe Block, ligne 2178
/** * Sets or removes the tool and level required to harvest this block. * * @param toolClass Class * @param level Harvest level: * Wood: 0 * Stone: 1 * Iron: 2 * Diamond: 3 * Gold: 0 */ public void setHarvestLevel(String toolClass, int level) { Iterator <iblockstate>itr = getBlockState().getValidStates().iterator(); while (itr.hasNext()) { setHarvestLevel(toolClass, level, itr.next()); } }@Vorax, on va y aller petit à petit, que veut tu faire en premier ? Quels outils ne peuvent-ils pas casser ton bloc ?</iblockstate>
-
Alors en fait, je veux que mon bloc de limon se casse plus vite à la pelle. C’est juste le but pour ce bloc.
Après, ce sera pour un autre bloc, mais j’aimerais faire en sorte que le bloc ne se casse pas à la main dans un premier temps. Ensuite, qu’il ne se casse pas avec la pelle et la hache par exemple.
-
Donc si je comprend bien pour ce bloc tu veux qu’on ne puisse le casser qu’avec la pelle :
@Override public boolean canHarvestBlock(IBlockAccess world, BlockPos pos, EntityPlayer player) { if(!(player.getHeldItem().getItem() instanceof ItemSpade)) { return false; } return super.canHarvestBlock(world, pos, player);; }J’ai pas testé, dis-moi
-
La fonction marche pour ne casser qu’avec la pelle.
Mais j’aimerais en fait que mon bloc de limon se casse plus VITE à la pelle.
J’aimerais aussi faire en sorte que le bloc ne se casse pas à la main dans un premier temps.
Ensuite, qu’il ne se casse pas avec la pioche ET la hache par exemple. -
Ah, oui désolé j’avais mal vu, donc comme le sable en fait, essaie avec Material.sand
-
this.setHarvestLevel(“spade”, 0);
dans le constructeur.- material.sand
-
Mais je me demandais robin, est ce que l’harvestLevel ne vas pas empêcher de le casser à la main ? Du moins il n’y aura pas de drop
-
Non.
-
Ca ne fonctionne pas.
Ligne de la classe principale:
limonBloc = new LimonBloc(Material.sand).setUnlocalizedName("limonbloc").setHardness(1.15F).setResistance(10.0F).setCreativeTab(CreativeTabs.tabBlock);Ligne de la classe ‘LimonBloc.java’ :
package fr.vorax.egypte.common; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemSpade; import net.minecraft.potion.Potion; import net.minecraft.potion.PotionEffect; import net.minecraft.util.BlockPos; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.client.event.sound.PlaySoundEvent; public class LimonBloc extends Block { public LimonBloc(Material material) { super(material); this.setHarvestLevel("spade", 0); } @Override public boolean canHarvestBlock(IBlockAccess world, BlockPos pos, EntityPlayer player) { if(!(player.getHeldItem().getItem() instanceof ItemSpade)) { return false; } return super.canHarvestBlock(world, pos, player); } } -
Mais du coup enlève la fonction canHarvestBlcok
-
Ca ne change rien quand je l’enlève.
-
C’est à dire, il y a quoi comme problème ?
-
Que ce soit à la main ou tous les outils, c’est le même temps pour casser le bloc.
-
C’est shovel et non spade.
Autant pour moi. -
Ah oui c’est vrai, c’est malin qu’ils aient mis spade au lieu de shovel tiens…
Enfin bon, ça marche.Mais pour que la pelle ET la pioche soient les seuls à droper le cube (et que la pioche n’aille pas forcément aussi vite que la pelle), il faut faire comment?
Après, je ne pense pas avoir d’autres questions, je préfère tout poser ici plutôt que de refaire d’autres sujets à chaque fois que je n’arrive pas à faire une petite chose. -
Via un event :
@SubscribeEvent public void onBlockDrop(BlockEvent.HarvestDropsEvent event) { if(event.state.getBlock() == ClassePrincipale.bloc && event.harvester != null && event.harvester.getCurrentEquippedItem() != null) { // si c'est ton bloc et que le bloc a été détruit par un joueur et que l'item qu'il a en main n'est pas nul Set <string>toolClass = event.harvester.getCurrentEquippedItem().getItem().getToolClasses(event.harvester.getCurrentEquippedItem()); // le type d'outil if(!toolClass.contains("pickaxe") && !toolClass.contains("shovel")) { // s'il ne contient ni pickaxe ni shovel (donc si ce n'est pas une pioche ni une pelle) event.drops.clear(); // on retire le drop } } } ```</string> -
J’ai essayé dans la classe ‘Limon Bloc.java’:
package fr.vorax.egypte.common; import java.util.Set; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemSpade; import net.minecraft.util.BlockPos; import net.minecraft.world.IBlockAccess; import net.minecraftforge.event.world.BlockEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; public class LimonBloc extends Block { public LimonBloc(Material material) { super(material); this.setHarvestLevel("shovel", 0); } @SubscribeEvent public void onBlockDrop(BlockEvent.HarvestDropsEvent event) { if(event.state.getBlock() == ModEgypte.limonBloc && event.harvester != null && event.harvester.getCurrentEquippedItem() != null) { // si c'est ton bloc et que le bloc a été détruit par un joueur et que l'item qu'il a en main n'est pas nul Set <string>toolClass = event.harvester.getCurrentEquippedItem().getItem().getToolClasses(event.harvester.getCurrentEquippedItem()); // le type d'outil if(!toolClass.contains("pickaxe") && !toolClass.contains("shovel")) { // s'il ne contient ni pickaxe ni shovel (donc si ce n'est pas une pioche ni une pelle) event.drops.clear(); // on retire le drop } } } }Ca ne fonctionne pas.</string>
-
Si tu veux utiliser un event : https://www.minecraftforgefrance.fr/showthread.php?tid=716
Sinon tu peux toujours modifier la fonction correspondante dans ton block (personnellement je préfère cette méthode si j’ai accès au block)
