Résolu Block Hardness
-
Bonjour, aujourd’hui j’ai voulut créer un block qui ne se casse que si on a la bonne clé, or je n’arrive pas à utiliser la fonction getPlayerRelativeBlockHardness :
package fr.scarex.ascalonmod.block; import java.util.Random; import net.minecraft.block.Block; import net.minecraft.block.BlockChest; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MathHelper; import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.ForgeHooks; import net.minecraftforge.common.util.Constants; import cpw.mods.fml.common.registry.GameRegistry; import fr.scarex.ascalonmod.AscalonMod; import fr.scarex.ascalonmod.item.IUnlocker; import fr.scarex.ascalonmod.proxy.ClientProxy; import fr.scarex.ascalonmod.tileentity.TileEntityLockedChest; /** * @author SCAREX * */ public class BlockLockedChest extends BlockChest { public static final String NAME = "lockedChest"; protected static final Random RNG = new Random(); protected BlockLockedChest() { super(2); this.setHardness(3.0F); // J'ai essayé avec plusieurs valeurs this.setBlockName(AscalonMod.MODID + "_" + NAME); this.setCreativeTab(CreativeTabs.tabDecorations); GameRegistry.registerBlock(this, NAME); GameRegistry.registerTileEntity(TileEntityLockedChest.class, AscalonMod.MODID + ":" + NAME); } @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { if (player.getHeldItem() != null && player.getHeldItem().getItem() instanceof IUnlocker) { int[] keys = ((IUnlocker) player.getHeldItem().getItem()).getKeys(player, world, x, y, z); for (int i = 0; i < keys.length; i++) { if (keys* == ((TileEntityLockedChest) world.getTileEntity(x, y, z)).keyCode) { if (world.isRemote) return false; player.openGui(AscalonMod.INSTANCE, 0, world, x, y, z); return true; } } } return false; } @Override public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) { return new TileEntityLockedChest(); } @Override public int getRenderType() { return ClientProxy.renderId; } @Override public void setBlockBoundsBasedOnState(IBlockAccess p_149719_1_, int p_149719_2_, int p_149719_3_, int p_149719_4_) {} @Override public void onBlockAdded(World p_149726_1_, int p_149726_2_, int p_149726_3_, int p_149726_4_) {} @Override public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase living, ItemStack stack) { byte b = 0; int l = MathHelper.floor_double((double) (living.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3; switch (l) { case 0: b = 2; break; case 1: b = 5; break; case 2: b = 3; break; case 3: b = 4; break; } world.setBlockMetadataWithNotify(x, y, z, b, 3); TileEntityLockedChest tile = (TileEntityLockedChest) world.getTileEntity(x, y, z); if (tile != null) { if (stack.hasTagCompound() && stack.getTagCompound().hasKey("key", Constants.NBT.TAG_INT)) tile.keyCode = stack.getTagCompound().getInteger("key"); else tile.keyCode = 0; } } @Override public void onNeighborBlockChange(World p_149695_1_, int p_149695_2_, int p_149695_3_, int p_149695_4_, Block p_149695_5_) {} @Override public void registerBlockIcons(IIconRegister p_149651_1_) { this.blockIcon = p_149651_1_.registerIcon("stone"); } @Override public void breakBlock(World world, int x, int y, int z, Block block, int meta) { TileEntityLockedChest tile = (TileEntityLockedChest) world.getTileEntity(x, y, z); ItemStack drop = new ItemStack(AscalonModBlocks.BLOCK_LOCKED_CHEST); NBTTagCompound comp = new NBTTagCompound(); comp.setInteger("key", ((TileEntityLockedChest) world.getTileEntity(x, y, z)).keyCode); drop.setTagCompound(comp); world.spawnEntityInWorld(new EntityItem(world, (double) x + 0.5D, (double) y + 0.5D, (double) z + 0.5D, drop)); if (tile != null) { for (int i = 0; i < tile.getSizeInventory(); i++) { ItemStack stack = tile.getStackInSlot(i); if (stack != null) { float f = this.RNG.nextFloat() * 0.8F + 0.1F; float f1 = this.RNG.nextFloat() * 0.8F + 0.1F; float f2 = this.RNG.nextFloat() * 0.8F + 0.1F; EntityItem entityItem; while (stack.stackSize > 0) { int j = this.RNG.nextInt(21) + 10; if (j > stack.stackSize) j = stack.stackSize; stack.stackSize -= j; entityItem = new EntityItem(world, (double) ((float) x + f), (double) ((float) y + f1), (double) ((float) z + f2), new ItemStack(stack.getItem(), j, stack.getItemDamage())); entityItem.motionX = (double) ((float) this.RNG.nextGaussian() * 0.05F); entityItem.motionY = (double) ((float) this.RNG.nextGaussian() * 0.05F + 0.2F); entityItem.motionZ = (double) ((float) this.RNG.nextGaussian() * 0.05F); if (stack.hasTagCompound()) entityItem.getEntityItem().setTagCompound((NBTTagCompound) stack.getTagCompound().copy()); world.spawnEntityInWorld(entityItem); } } } world.removeTileEntity(x, y, z); } } @Override public void dropBlockAsItemWithChance(World world, int x, int y, int z, int meta, float chance, int p_149690_7_) {} @Override public float getPlayerRelativeBlockHardness(EntityPlayer player, World world, int x, int y, int z) { if (player.getHeldItem() != null && player.getHeldItem().getItem() instanceof IUnlocker) { int[] keys = ((IUnlocker) player.getHeldItem().getItem()).getKeys(player, world, x, y, z); for (int i = 0; i < keys.length; i++) { if (keys* == ((TileEntityLockedChest) world.getTileEntity(x, y, z)).keyCode) { AscalonMod.LOGGER.info(ForgeHooks.blockStrength(this, player, world, x, y, z)); // Pour afficher la valeur dans la console. return ForgeHooks.blockStrength(this, player, world, x, y, z); // Si j'utilise çà, le block ne se casse jamais mais si je met une valeur fixe, le block se casse trop vite. } } } return -1.0F; } @Override public ItemStack getPickBlock(MovingObjectPosition target, World world, int x, int y, int z, EntityPlayer player) { ItemStack drop = new ItemStack(AscalonModBlocks.BLOCK_LOCKED_CHEST); NBTTagCompound comp = new NBTTagCompound(); comp.setInteger("key", ((TileEntityLockedChest) world.getTileEntity(x, y, z)).keyCode); drop.setTagCompound(comp); return drop; } }
Je ne sais pas si j’utilise mal la fonction ou s’il faut ré-écrire une autre fonction.
-
a quoi est censé te servir cette fonction?
-
Le but est que le joueur ne puisse pas détruire le coffre s’il n’a pas la bonne clé en main. J’utilise une interface pour récupérer tous les codes des clés d’un Item (car j’ai créé un trousseau de clé qui doit permettre d’ouvrir avec toutes les clés disponibles à l’intérieur).
-
Tu veux faire en sorte qu’il casse le block avec l’objet en main ou n’importe ou ?
-
Je veux juste que l’objet soit cassable uniquement par un Item, et incassable dans les autres cas, sauf que dans le code que j’ai fais le block se casse trop vite et ne prend pas en compte la valeur retournée.
-
return ForgeHooks.blockStrength(this, player, world, x, y, z);
-> return 15.0F; ou return super.getPlayerRelativeBlockHardness(player, world, x, y, z); -
J’ai déjà essayé avec une valeur statique, çà ne marche pas. Et faire le super reviens au même car il va chercher le blockHardness que j’ai définis dans le constructeur.
-
Tien , robin m’avais déjà répondu à ce propos .
-
Problème résolu, en fait il faut mettre une valeur à virgule très petite : plus la valeur est petite, plus çà prendre de temps. Merci de vos réponses.
-
Tient étrange ça, ce n’est pas du tout le comportement que j’avais constaté de mon côté.
-
Je pense que le setBlockHardness doit être inversé à un moment ou à un autre, car moi aussi je pensais que plus la valeurs était grande, plus le block prenait de temps à être détruit.