SOLVED Fonction onBlockPlacedBy et TileEntity


  • 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 😄

  • Modérateurs

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

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

    avant le onBlockPlacedBy?


  • 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

  • Administrateurs Rédacteurs Moddeurs confirmés

    @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.


  • 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é

  • Administrateurs Rédacteurs Moddeurs confirmés

    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.


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

  • Administrateurs Rédacteurs Moddeurs confirmés

    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());


  • 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

  • Administrateurs Rédacteurs Moddeurs confirmés

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


  • 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 ???

  • Modérateurs

    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.


  • 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)

  • Administrateurs Rédacteurs Moddeurs confirmés

    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.


  • 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 ??

  • Modérateurs

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


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

    Merci à vous pour votre aide !

    Problème résolut