Spawn d'un entity buguer



  • Salut,

    Je suis en train de crée un système de "vieillissement" de l'entity, et a un moment, je veux quelle mette bas un petit, pour cela :

    ​public void onUpdate()
    
        {
        super.onUpdate();
        int s = 20;
        int m = 1200;
    
        EntityMobBouftonBlanc entityboufton = new EntityMobBouftonBlanc(worldObj);
         entityboufton.setLocationAndAngles(this.posX, this.posY, this.posZ, this.rand.nextFloat() * 360.0F, 0.0F);
    
        if (this.worldObj.isRemote)    
        {
            if (this.getAge()  % m == 0) // Vieillissement
            {
                mobSizeOld *= 1.1F;
                System.out.println("veillit");
            }
    
            if (this.getAge()  % 200 == 0) // naissance
            {
                System.out.println("naissance");
                 this.worldObj.spawnEntityInWorld(entityboufton);
    
            }
        }
        }
    
    

    Le petit spawn bien, mais buguer, il ne bouge pas, on ne peut pas l'attaquer, il ne fait rien…

    Une idée ? 😕

    Ce la viens surment du world.isremote, mais le soucis c'est que sans ça, le getAge() ne fonctionne plus...



  • J'ai eu le même soucis pour mes spawns de monture et j'ai résolu ça par un paquet. En gros ton entité existe coté client et pas serveur.



  • Ok, merci, je suis assez novice avec les paquets.

    Mais bon, en théorie, je dois fait quoi ? Dire au serveur que l'entité a été crée ? Comment ? 😕


  • Administrateurs

    if (this.worldObj.isRemote)     ->     if (!this.worldObj.isRemote)

    worldObj.isRemote = world client
    !worldObj.isRemote = world server
    Le spawn des entités doit être fait côté serveur.



  • Merci, mais le soucis c'est que ducoup,

    ​ if (!this.worldObj.isRemote)    
    
        {
            if (this.getAge()  % vieillesse == 0) // Vieillissement
            {
                mobSizeOld *= 1.1F;
                System.out.println("veillit");
            }
    
            if (this.getAge()  % naissance == 0) // naissance
            {
    
                this.worldObj.spawnEntityInWorld(entityboufton);
                System.out.println("naissance");
            }
    
            if (this.getAge()  % mort == 0) // Meurt
            {
                this.setHealth(0.0F);
                System.out.println("meurt");
            }
        }
    
    

    Toute les actions : vieillesse, naissance, meut, s'execute en même temps ^^' Les conditions du this.getAge() sont tous ignorer.


  • Administrateurs

    Fait un print de this.getAge() ?
    ÉDIT : au pire si tu as vraiment besoin des paquets :

    Mais bon, je ne suis pas sûr qu'utiliser les paquets dans ce contexte soit une bonne idée.



  • Attention… ANARCHIE !

    [11:30:44] [Client thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 2
       [11:30:44] [Server thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 0
       [11:30:44] [Client thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 4
       [11:30:44] [Server thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 2
       [11:30:44] [Server thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 4
       [11:30:44] [Client thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 6
       [11:30:44] [Server thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 6
       [11:30:44] [Client thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 8
       [11:30:44] [Server thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 8
       [11:30:44] [Client thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 10
       [11:30:45] [Server thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 10
       [11:30:45] [Client thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 12
       [11:30:45] [Server thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 12
       [11:30:45] [Client thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 14
       [11:30:45] [Server thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 14
       [11:30:45] [Server thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 16
       [11:30:45] [Client thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 16
       [11:30:45] [Server thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 18
       [11:30:45] [Client thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 18
       [11:30:45] [Server thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 20
       [11:30:45] [Client thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 20
       [11:30:45] [Server thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 22
       [11:30:45] [Client thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 22
       [11:30:45] [Server thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 24
       [11:30:45] [Client thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 24
       [11:30:45] [Server thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 26
       [11:30:45] [Server thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 28
       [11:30:45] [Client thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 26
       [11:30:45] [Server thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 30
       [11:30:45] [Client thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 28
       [11:30:45] [Server thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 32
       [11:30:45] [Client thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 30
       [11:30:45] [Server thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 34
       [11:30:45] [Client thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 32
       [11:30:45] [Server thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 36
       [11:30:45] [Client thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 34
       [11:30:45] [Server thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 38
       [11:30:45] [Server thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 40
       [11:30:45] [Client thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 36
       [11:30:45] [Client thread/INFO] [STDOUT]: [EntityMobBouftou:onUpdate:45]: getAge() = 38
    
    

    Il envoie aussi aux client et aucune condition n'est respecter, il execute les 3 d'un coup. (enfin, casiement, en 40 ticks quoi ^^)

    EDIT : les paquets me servirons un jour de toute façon, mais c'est vrai que pour là, il ne devrais pas y en avoir besoin, enfin je l'espers…

    EDIT2 : en faite il envoie bien au serveur, j'avais pas mit le truc au bon endroit... mais les condition...


  • Administrateurs

    C'est étrange car comme tu peux le voir que ce soit côté client / serveur dans les deux cas la variable ne vaut pas 0.
    Si tu fais un print de this.getAge()  % mort == 0 ?



  • Elle est initialisé a "true" 😕

    Pourtant, mort est égal a 2400 ticks

    Edit : Ha, je crois que j'ai compris, en faite le getAge() bouge que quand le mob est en mouvement, sinon, elle repasse a 0 !

    Edit 2 : C'est bon !

    ​ public void onUpdate()
    
        {
        super.onUpdate();
        int s = 20;
        int m = 1200;
        int h = 72000;
        int j = 1728000;
    
        int vieillesse = s*5;//h*4;
        int naissance = s*30;//h*18;
        int mort =m;//j*2;
    
        EntityMobBouftonBlanc entityboufton = new EntityMobBouftonBlanc(this.worldObj);
         entityboufton.setLocationAndAngles(this.posX, this.posY, this.posZ, this.rand.nextFloat() * 360.0F, 0.0F);
    
         if (this.worldObj.getTotalWorldTime() % 1 == 0)
         {
         vie ++;
         System.out.println(vie);
         }
    
         if (this.worldObj.isRemote)    
         {
    
             if (this.vie  % vieillesse == 0) // Vieillissement
             {
                 mobSizeOld *= 1.1F;
                System.out.println("veillit");
             }
         }
    
         if (!this.worldObj.isRemote)    
         {
    
         if (this.vie == naissance) // naissance
         {         
             this.worldObj.spawnEntityInWorld(entityboufton);
           System.out.println("naissance");
         }
    
         if (this.vie == mort) // Meurt
         {
             this.setHealth(0.0F);
           System.out.println("meurt");
         }
    
        }
    
    

    Vue que le getAge() ne folnctionnais que quand l'entité marchait, et qu'elle repassais a 0, c'etait pas bon !

    Du coup j'ai crée une variable "vie" qui aumente de 1 a chaque tick du monde. Ducoup, tout fonctionne correctement !

    Merci Robin ne m'avoir mit sur cette piste !