Problème d'updatetick



  • Mon bloc ne fait absolument rien avec le updateTick (meêm pas un System.out.println :()… J'ai mis le setTickRandomly en true, mais rien à faire, y'a rien...

    Class :

    
    package utybo.mod.stuffgenerator;
    
    import java.util.Random;
    
    import net.minecraft.block.Block;
    import net.minecraft.block.material.Material;
    import net.minecraft.creativetab.CreativeTabs;
    import net.minecraft.entity.item.EntityTNTPrimed;
    import net.minecraft.init.Blocks;
    import net.minecraft.world.World;
    
    public class StuffGeneratorBlock extends Block {
    
        public Block generatorBlock;
        public InstabilityLevel instabilityLevel;
    
        //Constructeur
        protected StuffGeneratorBlock(Material material, Block genBlock,
        InstabilityLevel insLevel, CreativeTabs creaTab, String blockName) {
            super(material);
            this.setCreativeTab(creaTab);
            //Constructeur
            this.setTickRandomly(true);
        }
    
        protected void instabilityAction(World world, int x, int y, int z, InstabilityLevel instability, Random rand) {
    
            if (instability != InstabilityLevel.none) {
                if (instability == InstabilityLevel.xlight) {
                    this.instabilityExplosion(world, x, y, z, 1.0F, false, false,
                    rand.nextInt(10000));
                }
            //Le même code mais avec des valeurs différentes
            }
        }
    
        protected void instabilityExplosion(World world, int x, int y, int z, float power, boolean fireExplosion, boolean smokeExplosion, int r) {
            //Explosion
        }
    
        protected void generateBlocks(World world, int x, int y, int z) {
            world.setBlock(x + 1, y, z, this.generatorBlock);
            //même code avec coordonnés différentes
        }
    
        @Override
        public void updateTick(World world, int x, int y, int z, Random rand) {
            if (world.getBlock(x + 1, y, z) == Blocks.air || world.getBlock(x - 1, y, z) == Blocks.air
                //La même chose avec des || et des coordonnés différentes
            {
                this.instabilityAction(world, x, y, z, this.instabilityLevel, rand);
                this.generateBlocks(world, x, y, z);
            }
            System.out.println("Je fonctionne!"); //Le texte n'est pas affiché
            super.updateTick(world, x, y, z, rand); //J'ai mis ça à tout hasard, mais ça fonctionne pas...
        }
    }
    


  • J'ai testé ton code chez moi il marche (la fonction updateTick est lue) autrement il manque une parenthèse a la fin de la condition dans updateTick mais je pense que c'est une erreur quand tu a copié le code.

    Autrement tu a attendu combien de temps? Perso j'ai posé environs 10 blocks et j'avais un "je fonctionne!" toute les 20, 30 secondes donc ils sont assez rares (c'est relatif).

    Après ça pourrait aussi être un problème quand tu déclare le bloc mais je pense que tu ne pourrais tout simplement pas le poser.



  • Erreur de copie effectivement.
    Le problème c'est que normalement les logs devraient être spammés vu que updatetick est effectué toutes les 0,05 secondes 😞



  • Non celui qui est update toutes les 0,05 secondes est updateEntity() qui se trouve dans une class extend TileEntity assossiée à ton bloc.

    
    public class TileEntityclass extends TileEntity{
    public void updateEntity()
    {
    
    }
    }
    
    

    Si je ne me trompe pas.



  • Du coup il faut que je fasse une TileEntity?



  • Un truc dans le genre :

    
    public class StuffGeneratorBlock extends Block {
    
    public Block generatorBlock;
    public InstabilityLevel instabilityLevel;
    
    //Constructeur
    protected StuffGeneratorBlock(Material material, Block genBlock,
    InstabilityLevel insLevel, CreativeTabs creaTab, String blockName) {
    super(material);
    this.setCreativeTab(creaTab);
    //Constructeur
    }
    
    public TileEntity createTileEntity(World world, int metadata)
    {
    return new TileEntityclass();
    }
    
    public boolean hasTileEntity(int metadata)
    {
    return true;
    }
    
    //tes fonctions
    
    }
    
    

    Et une autre class avec :

    
    public class TileEntityclass extends TileEntity{
    
    public void updateEntity()
    {
    int x = this.xCoord;
    int y = this.yCoord;
    int z = this.zCoord;
    World world = this.worldObj;
    if (world.getBlock(x + 1, y, z) == Blocks.air
    || world.getBlock(x - 1, y, z) == Blocks.air)
    //La même chose avec des || et des coordonnés différentes
    {
    StuffGeneratorBlock.instabilityAction(world, x, y, z, this.instabilityLevel, rand);
    StuffGeneratorBlock.generateBlocks(world, x, y, z);
    
    }
    System.out.println("Je fonctionne!"); //Le texte n'est pas affiché
    }
    
    }
    
    

    Après c'est ce que je ferais, au moins tu aura une update toute les 0,05 secondes, je ne connais pas d'autres methodes mais il doit y en avoir.

    Edit : dans updateEntity() remplacer :
    this.instabilityAction(world, x, y, z, this.instabilityLevel, rand);
    this.generateBlocks(world, x, y, z);
    par :
    StuffGeneratorBlock.instabilityAction(world, x, y, z, this.instabilityLevel, rand);
    StuffGeneratorBlock.generateBlocks(world, x, y, z);


  • Administrateurs

    Aucune idée 😕



  • OK je teste ça et je te dis si ça fonctionne Vebert 🙂

    EDIT : Je peux pas utiliser mes fonctions dans le bloc du coup 😕



  • tu les passent en public et tu remplace (dans updateEntity() ) :
    this.instabilityAction(world, x, y, z, instabilityLevel, rand);
    this.generateBlocks(world, x, y, z);
    par :
    StuffGeneratorBlock.instabilityAction(world, x, y, z, instabilityLevel, rand);
    StuffGeneratorBlock.generateBlocks(world, x, y, z);

    et tu récupère ton instabilityLevel pour l'envoyer aux fonctions.



  • J'ai trouvé une autre solution!
    world.scheduleBlockUpdate(x, y, z, Block, ticks);
    à mettre dans le OnBlockAdded et le updateTick!

    Problème résolu!