MFF

    Minecraft Forge France
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes
    • Forge Events
      • Automatique
      • Foncé
      • Clair
    • S'inscrire
    • Se connecter

    Fonction onBlockPlacedBy et TileEntity

    Planifier Épinglé Verrouillé Déplacé Résolu Anciennes versions
    1.6.4
    17 Messages 3 Publieurs 3.8k Vues 1 Watching
    Charger plus de messages
    • Du plus ancien au plus récent
    • Du plus récent au plus ancien
    • Les plus votés
    Répondre
    • Répondre à l'aide d'un nouveau sujet
    Se connecter pour répondre
    Ce sujet a été supprimé. Seuls les utilisateurs avec les droits d'administration peuvent le voir.
    • MugiwaxarM Hors-ligne
      Mugiwaxar
      dernière édition par

      Bonjours à tous !

      Voila, j’aimerai faire en sorte que lorsqu’un bloc est placé, le nom de son propriétaire soit inscrit dans le TileEntity du bloc, pour cela, j’utilise la fonction onBlockPlacedBy()

      Voila mon problème, cette fonction est appelé avant la fonction createNewTileEntity(), donc quand j’essaye de récupérer mon tileEntity dans la fonction onBlockPlacedBy(), je reçois un “null”

      J’ai trouvé une solution, mais j’ai besoin de votre aide pour la terminer
      Voici mon code:

      
      @Override
      public void onBlockPlacedBy(World world, int X, int Y, int Z, EntityLivingBase entity, ItemStack item)
      {
      super.onBlockPlacedBy(world, X, Y, Z, entity, item);
      TileEntityTeleportBlock tile = (TileEntityTeleportBlock) world.getBlockTileEntity(X, Y, Z);
      
      if(tile == null)
      {
      tile = new TileEntityTeleportBlock("variable qui contiens le propriétaire");
      world.setBlockTileEntity(X, Y, Z, tile);
      }
      
      }
      
      @Override
      public TileEntity createNewTileEntity(World world)
      {
      //Et la, je sais pas quoi mêttre ??????
      }
      
      

      Voila 🙂
      Si on pouvais m’éclairer

      MERCI 😄

      1 réponse Dernière réponse Répondre Citer 0
      • Superloup10S Hors-ligne
        Superloup10 Modérateurs
        dernière édition par

        Qu’es-ce qui t’empêche de mettre :

        @Override
        public TileEntity createNewTileEntity(World world)
        {
        return new TileEntityTeleportBlock();
        }
        

        avant le onBlockPlacedBy?

        Si vous souhaitez me faire un don, il vous suffit de cliquer sur le bouton situé en dessous.

        Je suis un membre apprécié et joueur, j'ai déjà obtenu 17 points de réputation.

        1 réponse Dernière réponse Répondre Citer 0
        • MugiwaxarM Hors-ligne
          Mugiwaxar
          dernière édition par

          Ba simplement, la fonction onBlockPlacedBy() est appelé avant createNewTileEntity() lors de la pose du bloc, quelque sois l’ordre dans lequel les fonctions sont placé dans la classe

          1 réponse Dernière réponse Répondre Citer 0
          • robin4002R Hors-ligne
            robin4002 Moddeurs confirmés Rédacteurs Administrateurs
            dernière édition par

            @Override
            public void onBlockPlacedBy(World world, int X, int Y, int Z, EntityLivingBase entity, ItemStack item)
            {
            TileEntity tile = world.getBlockTileEntity(X, Y, Z);
            if(tile != null && tile instanceof TileEntityTeleportBlock)
            {
            TileEntityTeleportBlock teTeleport = (TileEntityTeleportBlock)tile;
            teTeleport.setOwner(entity.getEntityName());
            }
            }
            
            @Override
            public TileEntity createNewTileEntity(World world)
            {
            return new TileEntityTeleportBlock();
            }
            

            Et dans ton tile entity :

            public void setOwner(String ownerName)
            {
            this.owner = ownerName;
            }
            

            Et puis tu créé un field de type String nommé owner, et tu le sauvegarde dans le tag NBT.

            1 réponse Dernière réponse Répondre Citer 0
            • MugiwaxarM Hors-ligne
              Mugiwaxar
              dernière édition par

              Le même problème revient, dans la fonction onByPlacedBy, dans tout les cas le TileEntitity sera égal a ‘null’ vu qu’il est instancier après
              La fonction createNewTileEntity est appeler après la fonction onBlockPlacedBy quand un bloc est posé

              1 réponse Dernière réponse Répondre Citer 0
              • robin4002R Hors-ligne
                robin4002 Moddeurs confirmés Rédacteurs Administrateurs
                dernière édition par

                Nom, ça fonctionne, sinon de nombreux tutoriel du forum ne fonctionnerai pas (multi texture avec metadata, et même les tile entity de minecraft utilise ça pour les noms customs). Si le tileentity est null, ton problème vient d’ailleurs.

                1 réponse Dernière réponse Répondre Citer 0
                • MugiwaxarM Hors-ligne
                  Mugiwaxar
                  dernière édition par

                  Oui sa marche, mais je comprend pas pourquoi, et j’aime pas utiliser un truc que je comprend pas:s

                  1 réponse Dernière réponse Répondre Citer 0
                  • robin4002R Hors-ligne
                    robin4002 Moddeurs confirmés Rédacteurs Administrateurs
                    dernière édition par

                    C’est pas compliqué.
                    Lors que le bloc est posé, on cherche l’objet du tileentity. Si il n’est pas null est qu’il est d’instance TileEntityTeleportBlock, alors je cast TileEntityTeleportBlock pour avoir une variable de type TileEntityTeleportBlock, puis j’attribue la valeur de l’owner avec teTeleport.setOwner(entity.getEntityName());

                    1 réponse Dernière réponse Répondre Citer 0
                    • MugiwaxarM Hors-ligne
                      Mugiwaxar
                      dernière édition par

                      Oui sa j’avais compris,
                      ce que je comprend pas, c’est qu’il est justement instancié alors que la fonction createNewTileEntity() est appelé après la fonction onBlockPlacedBy()

                      Edit:

                      Voici l’erreur

                      
                      2014-01-31 22:37:06 [Infos] [STDERR] java.lang.InstantiationException: com.yvelis.mtpblocks.tileentity.TileEntityDurability
                      2014-01-31 22:37:06 [Infos] [STDERR] at java.lang.Class.newInstance(Unknown Source)
                      2014-01-31 22:37:06 [Infos] [STDERR] at net.minecraft.tileentity.TileEntity.createAndLoadEntity(TileEntity.java:140)
                      2014-01-31 22:37:06 [Infos] [STDERR] at net.minecraft.world.chunk.storage.AnvilChunkLoader.readChunkFromNBT(AnvilChunkLoader.java:440)
                      2014-01-31 22:37:06 [Infos] [STDERR] at net.minecraft.world.chunk.storage.AnvilChunkLoader.checkedReadChunkFromNBT(AnvilChunkLoader.java:103)
                      2014-01-31 22:37:06 [Infos] [STDERR] at net.minecraft.world.chunk.storage.AnvilChunkLoader.loadChunk(AnvilChunkLoader.java:83)
                      2014-01-31 22:37:06 [Infos] [STDERR] at net.minecraft.world.gen.ChunkProviderServer.safeLoadChunk(ChunkProviderServer.java:182)
                      2014-01-31 22:37:06 [Infos] [STDERR] at net.minecraft.world.gen.ChunkProviderServer.loadChunk(ChunkProviderServer.java:118)
                      2014-01-31 22:37:06 [Infos] [STDERR] at net.minecraft.server.MinecraftServer.initialWorldChunkLoad(MinecraftServer.java:294)
                      2014-01-31 22:37:06 [Infos] [STDERR] at net.minecraft.server.integrated.IntegratedServer.loadAllWorlds(IntegratedServer.java:90)
                      2014-01-31 22:37:06 [Infos] [STDERR] at net.minecraft.server.integrated.IntegratedServer.startServer(IntegratedServer.java:107)
                      2014-01-31 22:37:06 [Infos] [STDERR] at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:445)
                      2014-01-31 22:37:06 [Infos] [STDERR] at net.minecraft.server.ThreadMinecraftServer.run(ThreadMinecraftServer.java:16)
                      2014-01-31 22:37:06 [Avertissement] [Minecraft-Server] Skipping TileEntity with id TileEntityDurability
                      2014-01-31 22:37:06 [Infos] [STDERR] java.lang.InstantiationException: com.yvelis.mtpblocks.tileentity.TileEntityTeleportBlock
                      2014-01-31 22:37:06 [Infos] [STDERR] at java.lang.Class.newInstance(Unknown Source)
                      2014-01-31 22:37:06 [Infos] [STDERR] at net.minecraft.tileentity.TileEntity.createAndLoadEntity(TileEntity.java:140)
                      2014-01-31 22:37:06 [Infos] [STDERR] at net.minecraft.world.chunk.storage.AnvilChunkLoader.readChunkFromNBT(AnvilChunkLoader.java:440)
                      2014-01-31 22:37:06 [Infos] [STDERR] at net.minecraft.world.chunk.storage.AnvilChunkLoader.checkedReadChunkFromNBT(AnvilChunkLoader.java:103)
                      2014-01-31 22:37:06 [Infos] [STDERR] at net.minecraft.world.chunk.storage.AnvilChunkLoader.loadChunk(AnvilChunkLoader.java:83)
                      2014-01-31 22:37:06 [Infos] [STDERR] at net.minecraft.world.gen.ChunkProviderServer.safeLoadChunk(ChunkProviderServer.java:182)
                      2014-01-31 22:37:06 [Infos] [STDERR] at net.minecraft.world.gen.ChunkProviderServer.loadChunk(ChunkProviderServer.java:118)
                      2014-01-31 22:37:06 [Infos] [STDERR] at net.minecraft.server.MinecraftServer.initialWorldChunkLoad(MinecraftServer.java:294)
                      2014-01-31 22:37:06 [Infos] [STDERR] at net.minecraft.server.integrated.IntegratedServer.loadAllWorlds(IntegratedServer.java:90)
                      2014-01-31 22:37:06 [Infos] [STDERR] at net.minecraft.server.integrated.IntegratedServer.startServer(IntegratedServer.java:107)
                      2014-01-31 22:37:06 [Infos] [STDERR] at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:445)
                      2014-01-31 22:37:06 [Infos] [STDERR] at net.minecraft.server.ThreadMinecraftServer.run(ThreadMinecraftServer.java:16)
                      2014-01-31 22:37:06 [Avertissement] [Minecraft-Server] Skipping TileEntity with id tileEntityTeleportBlock
                      
                      

                      Edit 2:
                      Raison possible n°1: J’utilise un constructeur pour le TileEntity

                      
                      @Override
                      public TileEntity createNewTileEntity(World world)
                      {
                      return new TileEntityTeleportBlock(m_durability);
                      }
                      
                      

                      Raison possible n°2: J’utilise le même TileEntity pour plusieurs blocs différents

                      1 réponse Dernière réponse Répondre Citer 0
                      • robin4002R Hors-ligne
                        robin4002 Moddeurs confirmés Rédacteurs Administrateurs
                        dernière édition par

                        Les deux, les tile entity ne doivent pas avoir de constructeur, et c’est 1 bloc = 1 tile entity.

                        1 réponse Dernière réponse Répondre Citer 0
                        • MugiwaxarM Hors-ligne
                          Mugiwaxar
                          dernière édition par

                          Super, merci, tout fonctionne, j’ai supprimé le constructeur du TileEntity et j’ai plus l’erreur
                          Par contre pour le TileEntity en commun a plusieurs blocs j’ai laissé et ça à l’air de fonctionner pour le moment, ça m’embêterai énormément d’en créer un pour chaque blocs, voila comment sa se passe:

                          TileEntityDurability (durabilité du bloc)
                          -> block1
                          -> block2
                          -> block3
                          -> block4

                          Et j’utilise le même pour tous

                          Sa pose problème quelque part ???

                          1 réponse Dernière réponse Répondre Citer 0
                          • Superloup10S Hors-ligne
                            Superloup10 Modérateurs
                            dernière édition par

                            Si tu souhaites utiliser une durabilité différente selon les blocs, tu n’as pas besoin d’un tileEntity pour cela. Un simple Enum devrait suffire.

                            Si vous souhaitez me faire un don, il vous suffit de cliquer sur le bouton situé en dessous.

                            Je suis un membre apprécié et joueur, j'ai déjà obtenu 17 points de réputation.

                            1 réponse Dernière réponse Répondre Citer 0
                            • MugiwaxarM Hors-ligne
                              Mugiwaxar
                              dernière édition par

                              Oula ! C’est quelque chose d’iper intéressant à savoir ça !
                              Et comment je fait ?
                              (sachant qu’il faut stocker la durabilité actuelle quelque part)

                              1 réponse Dernière réponse Répondre Citer 0
                              • robin4002R Hors-ligne
                                robin4002 Moddeurs confirmés Rédacteurs Administrateurs
                                dernière édition par

                                Ta durabilité correspond à quoi ? Une variable dans ton tile entity ? Si oui, tu fais comme avec l’owner. Tu fais un setter dans ton tile entity, et avec la fonction onBlockPlacedBy tu mets la variable à la valeur voulu.

                                1 réponse Dernière réponse Répondre Citer 0
                                • MugiwaxarM Hors-ligne
                                  Mugiwaxar
                                  dernière édition par

                                  A ba ça je suis bien d’accord, mais comme dit, j’ai utilisé un seul tileEntity pour des blocs différents
                                  Tout fonctionne très très bien, le problème est d’ailleurs résolut depuis quelques post

                                  J’ai juste pas compris la réponse de Superloup10, comment faire un compteur sans tilesEntity ??

                                  1 réponse Dernière réponse Répondre Citer 0
                                  • Superloup10S Hors-ligne
                                    Superloup10 Modérateurs
                                    dernière édition par

                                    Désolé, j’avais pas compris ce que tu entendais pas durabilité.

                                    Si vous souhaitez me faire un don, il vous suffit de cliquer sur le bouton situé en dessous.

                                    Je suis un membre apprécié et joueur, j'ai déjà obtenu 17 points de réputation.

                                    1 réponse Dernière réponse Répondre Citer 0
                                    • MugiwaxarM Hors-ligne
                                      Mugiwaxar
                                      dernière édition par

                                      Ok ^^
                                      Jpensais que c’était une solution plus facile

                                      Merci à vous pour votre aide !

                                      Problème résolut

                                      1 réponse Dernière réponse Répondre Citer 0
                                      • 1 / 1
                                      • Premier message
                                        Dernier message
                                      Design by Woryk
                                      ContactMentions Légales

                                      MINECRAFT FORGE FRANCE © 2024

                                      Powered by NodeBB