Tnt A Plusieurs Nom



  • Bonjour, je suis débutant sur l'api Forge, j'ai de la connaissance avec Bukkit et Spigot et des bases solides avec le mod coder pack de Minecraft .
    :X (Excusé moi d'avance si je fais qu'elle que faute d’orthographe !) :X
    Un jour je décide de faire un mod ou l'on vois le au dessus d'une "EntityPrimedTnt" un timer avec le nombre de tick qu'elle lui reste avant d'exploser !
    Mais malheureusement ma méthode ne fonctionne pas alors qu'elle le devrais par pure logique  !  😢   😢 
    (Ce que j'ai codé fais en sorte de faire disparaître la tnt !)

    //AIDE
    \AVIS

    Je prends avec les bras grands ouvert !

    @SubscribeEvent
       public void TntTag(EntityJoinWorldEvent e){
           if(e.getEntity() instanceof EntityTNTPrimed){
            EntityTNTPrimed tnt = (EntityTNTPrimed) e.getEntity();
            tnt.setAlwaysRenderNameTag(true);
            while(tnt.getFuse() != 0){
            tnt.setCustomNameTag(tnt.getFuse()+"");
            }
           }  
       }
    

  • Administrateurs

    Salut,
    Faire une boucle while ici n'est pas une bonne idée, tu bloques toute l’exécution du code.
    Pour modifier le tag il faudrait passer par une fonction appelé à chaque tick (par contre il n'y a que des event de tick pour les entité vivante et par pour les tnt, donc il faudrait passer par une fonction de tick de world et itérer sur toutes les entités chargés).



  • @'robin4002':

    Salut,
    Faire une boucle while ici n'est pas une bonne idée, tu bloques toute l’exécution du code.
    Pour modifier le tag il faudrait passer par une fonction appelé à chaque tick (par contre il n'y a que des event de tick pour les entité vivante et par pour les tnt, donc il faudrait passer par une fonction de tick de world et itérer sur toutes les entités chargés).

    Ok Merci, du cout si j'ai bien compris il faut que je face une fonctionne qui s’exécute tout les ticks et qui va set le nom de la tnt ?


    @'floflolol':

    @'robin4002':

    Salut,
    Faire une boucle while ici n'est pas une bonne idée, tu bloques toute l’exécution du code.
    Pour modifier le tag il faudrait passer par une fonction appelé à chaque tick (par contre il n'y a que des event de tick pour les entité vivante et par pour les tnt, donc il faudrait passer par une fonction de tick de world et itérer sur toutes les entités chargés).

    Ok Merci, du cout si j'ai bien compris il faut que je face une fonctionne qui s’exécute tout les ticks et qui va set le nom de la tnt ?

    Merci, j'ai trouvé comment faire, j'ai fait un event avec les ticks du serveur !

    private ModTutorial ModTutorial;
    
    private EntityTNTPrimed tnt;
    
    @SubscribeEvent
       public void TntTag(EntityJoinWorldEvent e){
           if(e.getEntity() instanceof EntityTNTPrimed){
            tnt = (EntityTNTPrimed) e.getEntity();
            tnt.setGlowing(true);
            tnt.setAlwaysRenderNameTag(true);
           }  
       }
    
    @SubscribeEvent
    public void tickWorld(TickEvent.ServerTickEvent e){
    if(tnt == null) return;
    
    tnt.setCustomNameTag(tnt.getFuse()+"");
    }
    

    @'floflolol':

    @'robin4002':

    Salut,
    Faire une boucle while ici n'est pas une bonne idée, tu bloques toute l’exécution du code.
    Pour modifier le tag il faudrait passer par une fonction appelé à chaque tick (par contre il n'y a que des event de tick pour les entité vivante et par pour les tnt, donc il faudrait passer par une fonction de tick de world et itérer sur toutes les entités chargés).

    Ok Merci, du cout si j'ai bien compris il faut que je face une fonctionne qui s’exécute tout les ticks et qui va set le nom de la tnt ?

    Merci, j'ai trouvé comment faire, j'ai fait un event avec les ticks du serveur !

    private ModTutorial ModTutorial;
    
    private EntityTNTPrimed tnt;
    
    @SubscribeEvent
       public void TntTag(EntityJoinWorldEvent e){
           if(e.getEntity() instanceof EntityTNTPrimed){
            tnt = (EntityTNTPrimed) e.getEntity();
            tnt.setGlowing(true);
            tnt.setAlwaysRenderNameTag(true);
           }  
       }
    
    @SubscribeEvent
    public void tickWorld(TickEvent.ServerTickEvent e){
    if(tnt == null) return;
    
    tnt.setCustomNameTag(tnt.getFuse()+"");
    }
    


  • Résolu ?
    Tu me rappelles quelqu'un qui m'avait demandé strictement la même chose via skype ? Si c'est le cas, sache que tu ne pourras pas customiser le rendu du nametag, comme taille du name, couleur, et autres… (si tu es la personne dont je parle, tu aurais souhaité un mode de rendu "rainbow", mais peut-être je me trompe complètement).



  • @'Plaigon':

    Résolu ?
    Tu me rappelles quelqu'un qui m'avait demandé strictement la même chose via skype ? Si c'est le cas, sache que tu ne pourras pas customiser le rendu du nametag, comme taille du name, couleur, et autres… (si tu es la personne dont je parle, tu aurais souhaité un mode de rendu "rainbow", mais peut-être je me trompe complètement).

    Ce n'est point moi, comme je l'ais dit tout a l'heure je suis un débutant !
    Et de plus je peut faire un rainbow, car j'ai juste a changer les couleurs a chaque tick :3 ! Mais si ta une autre méthode a me présenter je veux bien la voir si cela ne te dérange pas !
    Cela pourrait m'aidez dans mon parcours forge !



  • Peut-être que le name tag supporte le code couleur de MC. Non je n'ai aucune alternative pour débutant, suis celle actuelle, c'est déjà bien !



  • @'Plaigon':

    Peut-être que le name tag supporte le code couleur de MC. Non je n'ai aucune alternative pour débutant, suis celle actuelle, c'est déjà bien !

    Ok merci j'ai finis de le développer et je suis fier pour un début !  😄 😉


  • Administrateurs

    Ce que tu as fait ne fonctionnera pas une fois qu'il y aura plusieurs tnt.
    Il faudrait plutôt faire comme ça :

    @SubscribeEvent
    public void TntTag(EntityJoinWorldEvent e) {
    if (e.getEntity() instanceof EntityTNTPrimed) {
    EntityTNTPrimed tnt = (EntityTNTPrimed) e.getEntity();
    tnt.setGlowing(true);
    tnt.setAlwaysRenderNameTag(true);
    }
    }
    
    @SubscribeEvent
    public void tickWorld(TickEvent.WorldTickEvent e) {
    for(Entity entity : e.world.loadedEntityList)
    {
    if(entity instanceof EntityTNTPrimed)
    {
    EntityTNTPrimed tnt = (EntityTNTPrimed) entity;
    tnt.setCustomNameTag(tnt.getFuse()+"");
    }
    }
    }
    


  • @'robin4002':

    Ce que tu as fait ne fonctionnera pas une fois qu'il y aura plusieurs tnt.
    Il faudrait plutôt faire comme ça :

    @SubscribeEvent
    public void TntTag(EntityJoinWorldEvent e) {
    if (e.getEntity() instanceof EntityTNTPrimed) {
    EntityTNTPrimed tnt = (EntityTNTPrimed) e.getEntity();
    tnt.setGlowing(true);
    tnt.setAlwaysRenderNameTag(true);
    }
    }
    
    @SubscribeEvent
    public void tickWorld(TickEvent.WorldTickEvent e) {
    for(Entity entity : e.world.loadedEntityList)
    {
    if(entity instanceof EntityTNTPrimed)
    {
    EntityTNTPrimed tnt = (EntityTNTPrimed) entity;
    tnt.setCustomNameTag(tnt.getFuse()+"");
    }
    }
    }
    

    Je sais merci mais je sais pas si ton systeme est mieux que le mien, car j'ai fais un systeme de liste du coût !

    
    private int tick = 0;
    private int seconde = 0;
    private int maxTick = 20;
    private int maxSeconde = 9;
    
    @SubscribeEvent
        public void TntTag(EntityJoinWorldEvent e){
            if(e.getEntity() instanceof EntityTNTPrimed && !e.getEntity().world.isRemote){
            EntityTNTPrimed tnt = (EntityTNTPrimed) e.getEntity();
            tnt.setGlowing(true);
            tnt.setAlwaysRenderNameTag(true);
            tntList.add(tnt);
            }  
        }
    
    @SubscribeEvent
    public void tickWorld(TickEvent.PlayerTickEvent e){
    if(tntList.size() == 0) return;
    
    EntityTNTPrimed tnt = null;
    tick++;
    onTickSeconde();
    for(int i=0;i<tntlist.size();i++) {<br="">tnt = tntList.get(i);
    if(tnt.getFuse() == 0){
    tntList.remove(i);
    }
    tnt.setCustomNameTag("§"+seconde+tnt.getFuse());
    }
    }
    
    public void onTickSeconde(){
    if(tick >= maxTick){
    tick -= maxTick;
    seconde++;
    }
    
    if(seconde >= maxSeconde){
    seconde -= maxSeconde;
    }
    }
    
    

    Après qu'elle que test visuel la tienne report , merci 😄  (Je l'aurais un jour, je l'aurais) !</tntlist.size();i++)>


  • Administrateurs

    Ta méthode est légèrement plus coûteuse en mémoire comme tu as une array d’éléments qui sont déjà dans une autre array.
    Par contre tu itère sur une liste courte qui ne contient que des EntityTNTPrimed alors que ma méthode itère sur toutes les entités et doit à chaque fois vérifier l'instance de l'entité.

    Ta méthode est donc bien moins gourmande en cpu (surtout quand il y a beaucoup d'autres entités) par rapport à la mienne et je pense que c'est un choix plus pertinent comme mc est principalement limité par le cpu.



  • @'robin4002':

    Ta méthode est légèrement plus coûteuse en mémoire comme tu as une array d’éléments qui sont déjà dans une autre array.
    Par contre tu itère sur une liste courte qui ne contient que des EntityTNTPrimed alors que ma méthode itère sur toutes les entités et doit à chaque fois vérifier l'instance de l'entité.

    Ta méthode est donc bien moins gourmande en cpu (surtout quand il y a beaucoup d'autres entités) par rapport à la mienne et je pense que c'est un choix plus pertinent comme mc est principalement limité par le cpu.

    Du coût c'est bien ou pas ?


  • Administrateurs

    Tout est dit dans la dernière phrase ^^

    je pense que c'est un choix plus pertinent comme mc est principalement limité par le cpu.

    (je parle de ton choix)



  • @'robin4002':

    Tout est dit dans la dernière phrase ^^

    je pense que c'est un choix plus pertinent comme mc est principalement limité par le cpu.

    (je parle de ton choix)

    Ok merci de ta réponse !


    @'robin4002':

    Tout est dit dans la dernière phrase ^^

    je pense que c'est un choix plus pertinent comme mc est principalement limité par le cpu.

    (je parle de ton choix)

    Mais juste, normale que quand j'ajoute 1 tnt dans la liste et se duplique dans la liste ? (C'est Problématique !)


  • Administrateurs

    Car l'event EntityJoinWorldEvent est appelé deux fois, une fois en client et une fois en serveur.
    Ajouter && !e.getEntity().world.isRemote dans la condition devrait régler le problème



  • @'robin4002':

    Car l'event EntityJoinWorldEvent est appelé deux fois, une fois en client et une fois en serveur.
    Ajouter && !e.getEntity().world.isRemote dans la condition devrait régler le problème

    Merci, 2e question , devrais-je utiliser ma méthode pour renommé les tnt comme ceci ou utiliser un la classe RenderTNTPrimed ?


  • Administrateurs

    Tu peux utiliser ta méthode pour faire ça.