Résolu Block
-
Bonjour,
Alors je rencontre un problème: Je fait un bloc propre (en l’occurrence block1) qui se salit au bout de 6 secondes en block sale (bloc de bedrock), une fois le block1 (bloc propre) remplasser par le bloc de bedrock (bloc sale) il faut le nettoyer avec un item balai en fessant un clic droit sur le bloc de bedrock pour le remplacer par un bloc propre (block1) et remettre le timer .
Tout ça marche mais y’a un problème c’est que le timer reste a -1 et se remet pas a 6*20
Code (Vous comprendrez mieux ^^):
package com.CSC.net.item; import java.util.Random; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.util.BlockPos; import net.minecraft.util.EnumFacing; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; public class block1 extends Block { protected block1(Material materialIn) { super(materialIn); this.setTickRandomly(true); } private int timer = 6 * 20; // timer 6 * 20 donc 6 secondes. @SideOnly(Side.CLIENT) public void randomDisplayTick(World world, BlockPos pos, IBlockState state, Random rand) { if(timer > 0) // Si le timer et plus grand que 0 { timer–; // on soustrait le timer tant qu'il n'atteint pas 0 System.out.println(timer); } else if(timer == 0) // quand le timer atteint 0 { world.setBlockState(new BlockPos(pos.getX(), pos.getY(), pos.getZ()), Blocks.bedrock.getDefaultState()); // On remplace le block1 (propre) en bloc de bedrock (sale) timer = -1;// et on met le timer a -1. } } public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumFacing side, float hitX, float hitY, float hitZ) { if(state.getBlock() == Blocks.bedrock && playerIn.getItemInUse().getItem() == CSCItems.balai && timer == -1) { worldIn.setBlockState(new BlockPos(pos.getX(), pos.getY(), pos.getZ()), CSCBlocks.block1.getDefaultState()); // on remplace le bloc sale par un bloc propre timer = 6 * 20; // et on remet le timer a 6 * 20 pour re rentrer dans la boucle timer > 0 Le soucis est que le timer reste a -1 et que meme si le joueur clique droit sans l'item balai ça marche. //J'ai essayer avec l'event PlayerInteractEvent c'était le même soucis le timer restait a -1 } System.out.println(timer); return false; } }
Merci
-
Ton timer est un variable global à la classe, or ta classe n’a qu’une seule instance partagé entre tous les blocs.
Donc ta variable timer est partagé entre tous les blocs.
D’où l’intérêt des tile entity.
Mais ton cas ce n’est pas nécessaire, car on peut se passer de cette variable grâce à la fonction tickRate et updateTick.Ah et utiliser randomDisplayTick pour faire un setBlockState c’est du n’importe quoi.
On ne fait pas un setBlockState côté client … -
Salut
Tu as fais en sorte que si le timer est à zéro, ça le met à -1. Sauf que tu l’as mis dans la fonction randomDisplayTick, qui est appelé à chaque tick. Du coup, dès que le timer passe à 0, ça le met à -1. -
@‘robin4002’:
Ton timer est un variable global à la classe, or ta classe n’a qu’une seule instance partagé entre tous les blocs.
Donc ta variable timer est partagé entre tous les blocs.
D’où l’intérêt des tile entity.
Mais ton cas ce n’est pas nécessaire, car on peut se passer de cette variable grâce à la fonction tickRate et updateTick.Ah et utiliser randomDisplayTick pour faire un setBlockState c’est du n’importe quoi.
On ne fait pas un setBlockState côté client …Comment je peux faire alors que au bout de 6 secondes le bloc change ?
-
Avec la fonction tickRate, tu return l’équivalent de 6 secondes (1sec = 20ticks), et dans updateTick, tu set le block “sale”.
-
@‘AymericRed’:
Avec la fonction tickRate, tu return l’équivalent de 6 secondes (1sec = 20ticks), et dans updateTick, tu set le block “sale”.
thx
edit:
Petite question: Normal que c’est pas vraiment juste le tickRate des fois il met du temps des fois non un peu bizarre.
Et j’ai une question aussi si je veux faire spawn un bloc sur les blocs sale mais pas sur tout les blocs sale sur quelques un aléatoirement quoi, comment je peux faire ?
-
Oui c’est un peu aléatoire, je crois pas qu’on puisse le retirer.
Pour le spawn aléatoire, tu fais un ```java
if(world.rand.nextInt(2) == 0) //Là tu auras une chance sur deux -
Si, on peut enlever le random. Il suffit d’utiliser la méthode world.scheduleUpdate(pos, this, this.tickRate(world)); à l’intérieur de la fonction update et de la fonction onBlockAdded
C’est comme ça que les liquides fonctionnent. -
super merci ?!