Créer un bloc sensible aux ticks



  • version de forge : 12.18.1.2021 for Minecraft 1.10.2

    Bonjour,
    Je voudrais créer un bloc sensible aux ticks, ce que je pensais être simple à faire mais même après de nombreuses recherches je n'ai pas trouvé comment faire.
    J'ai pourtant appelé setTickRandomly(true) dans le constructeur et redéfini la méthode updateTick() mais elle n'est jamais appelée.
    Voici mon code :

    package com.trcgames.commandBlockUltra.cbuBlocks;
    
    import java.util.Random;
    
    import javax.swing.JFrame;
    
    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.item.ItemStack;
    import net.minecraft.tileentity.TileEntity;
    import net.minecraft.util.EnumFacing;
    import net.minecraft.util.EnumHand;
    import net.minecraft.util.math.BlockPos;
    import net.minecraft.util.text.TextComponentString;
    import net.minecraft.world.World;
    
    public class AdvancedCommandBlock extends Block{
    
     public AdvancedCommandBlock (){
    
     super (Material.IRON);
    
      setBlockUnbreakable();
      setResistance(6000000.0F);
      setUnlocalizedName ("advancedCommandBlock");
      setRegistryName ("advanced_command_block");
    
      setTickRandomly (true);
     }
    
     @Override
     public boolean hasTileEntity (IBlockState state){
      return true;
     }
    
     @Override
     public TileEntity createTileEntity (World world, IBlockState state){
      return new TileEntityAdvancedCommandBlock ();
     }
    
     @Override
     public boolean onBlockActivated (World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ) {
    
      if (world.isRemote) return false;
    
      JFrame frame = new JFrame ("test");
      frame.setSize (500, 200);
      frame.setVisible (true);
    
      return true;
     }
    
     @Override
     public void updateTick(World worldIn, BlockPos pos, IBlockState state, Random rand){
      System.out.println("test");
     }
    }
    

    Merci de votre aide.

    PS : Quand on fait un clic droit sur le bloc sans item dans la main, la méthode onBlockActivated() est appelée 2 fois côté serveur et 2 fois côté client, est-ce normal.


  • Rédacteurs

    Je vois que tu as un TE pour ton bloc, pourquoi ne pas l'utiliser pour faire ce que tu veux ? Implémente ITickable (du package inventory) et après tu auras la fonction update()


  • Administrateurs

    Salut,
    Ton code est bon pour le tick, il n'y a pas de raison que ça ne fonctionne pas.

    La fonction onBlockActivated est appelé deux fois pour chaque côté depuis la 1.9 à cause des deux mains.
    Par contre un JFrame dans minecraft et en plus côté serveur … Pas une bonne idée.



  • [size=smallJe vois que tu as un TE pour ton bloc, pourquoi ne pas l'utiliser pour faire ce que tu veux ? Implémente ITickable (du package inventory) et après tu auras la fonction update()]

    Ok merci ça fonctionne ! Par contre, il n'y a pas de "ITickable" dans le package "inventory" (du moins, pas en 1.10), j'ai pris celui du package "util".

    [size=smallSalut,]

    [size=smallTon code est bon pour le tick, il n'y a pas de raison que ça ne fonctionne pas.]

    En fait j'ai déjà eu ce problème de méthode qui ne s'appelle pas (la dernière fois c'était les méthodes pre-init, init et post-init). J'ai donc changé de version de forge et ça a marché avec EXACTEMENT le même code.

    [size=smallLa fonction onBlockActivated est appelé deux fois pour chaque côté depuis la 1.9 à cause des deux mains.]

    Merci !

    [size=smallPar contre un JFrame dans minecraft et en plus côté serveur … Pas une bonne idée.]

    Ma JFrame est uniquement côté client :
    if (world.isRemote) return false
    J'hésite encore entre une JFrame et un GUI. Je sais que le GUI est la meilleure solution, mais il serait très difficile à faire car, je voudrais un GUI un peu comme Eclipse avec des zones d'écriture qui change de couleur automatiquement, des scrollPanes, etc..
    Est-ce possible de faire ça dans un GUI Minecraft ? Si oui j'ouvrirais un nouveau sujet pour qu'on puisse me guider.

    PS : comment je mets ce sujet en résolu ?


  • Modérateurs

    Pour mettre en résolu, il faut éditer le premier message et changer les tags.

    Pour ce qui est des zones d'écriture, c'est possible à faire avec un(e ?) GUI mais assez compliqué car il faut gérer chacune des combinaisons de touches possibles (cependant LWJGL doit pouvoir aider pour ça).
    Néanmoins, je te conseillerai d'utiliser Swing qu'en dernier recours car ça ne s'intégrera pas bien avec le jeu.


  • Rédacteurs

    Pour information :
    isRemote == est ce que le monde est distant == le monde est-t-il hébergé sur ma machine == client
    !isRemote == le contraire == serveur
    Donc quand tu fait

    
    if(word.isRemote) { //Si le monde est client
    return false; //Retourner faux, au passage même si le code ne fait rien sur un side, si il fait un action sur l'autre side mieux vaut retourner vrai
    }
    
    

    Du coup on devrait plutôt avoir :

    
    if(!world.isRemote) return true;
    
    

    Il t'est possible de faire tout ce que tu veux dans un GUI Minecraft, il suffit juste de créer les différentes fonctionnalités

    Pour mettre en résolu il te faut éditer ton premier message et changer la balise.

    PS : Et oui ITickable était peut-être pas dans inventory mais je voulais dire de ne pas prendre celui du rendu, c'était surtout pour ça (j'était pas aller voir le nom du package)



  • [size=smallPour information : ]
    [size=smallisRemote == est ce que le monde est distant == le monde est-t-il hébergé sur ma machine == client]
    [size=small!isRemote == le contraire == serveur]
    [size=smallDonc quand tu fait ]

    1. if(word.isRemote) { //Si le monde est client
    2. return false;  //Retourner faux, au passage même si le code ne fait rien sur un side, si il fait un action sur l'autre side mieux vaut retourner vrai
    3. }
    4.  

    [size=smallDu coup on devrait plutôt avoir :]

    1. if(!world.isRemote) return true;
    2.  

    Ok merci !

    [size=smallIl t'est possible de faire tout ce que tu veux dans un GUI Minecraft, il suffit juste de créer les différentes fonctionnalités]

    Bon je vais m'y mettre alors.

    [size=smallPour ce qui est des zones d'écriture, c'est possible à faire avec un(e ?) GUI mais assez compliqué car il faut gérer chacune des combinaisons de touches possibles (cependant LWJGL doit pouvoir aider pour ça).]

    J'y avais déjà pensé (j'ai quelques bases en LWJGL). Merci !