Pop/depop d'une entité via deco/reco player



  • Salut !

    J'aimerai faire en sorte que quand le joueur deco, l'entité qui lui est liée (Clap-Trap) "déconnecte" lui aussi, puis qu'il réaparait a ça position lors de la reco du joueur.

    Je sais déja que la détection de deco/reco se fait via event forge, le soucis reste l'entité…

    Je présume que je dois enregistrer la pos x,y,z de l'entité, qui servira pour la position de reconnexion, mais comment dois-je procédé ?

    si j'utilise la commande despawnEntity(), elle perd les propriété accumulé et ce qu'elle a d’équipe. Ce qui risque d’être assez problématique.

    Est ce possible déjà ? Si oui, quel piste a suivre ? Je dois stocker tout dans un packet ?

    Merci.

    EDIT :

    Sinon, est ce qu'une téléportation + invincible dans une zone suffit ? A la deco, l'entité va dans un endroit precis en invincible et a la reco elle reviens a ça place en vulnérable.

    Qu'elle serai le mieux ?


  • Correcteurs

    Et si tu faisais un item qui permettrait de stocker l'entité dans l'inventaire du joueur?


  • Administrateurs

    Faudrait mettre toutes les données de l'entité dans le tag nbt du joueur.



  • "Et si tu faisais un item qui permettrait de stocker l'entité dans l'inventaire du joueur? "

    Ouai, mais si le mec déco, il perd sont clap trap ^^'

    "Faudrait mettre toutes les données de l'entité dans le tag nbt du joueur. "

    Ok, voici le code sur mon entité :

    @Override
    public void writeToNBT(NBTTagCompound compound)
    {
    super.writeToNBT(compound);
    
    DataWatcher dw = this.getDataWatcher();
    
    compound.setString("playerID", this.playerID);
    compound.setString("playerName", this.playerName);
    compound.setString("otherID", this.otherID);
    compound.setInteger("color", dw.getWatchableObjectInt(20));
    compound.setInteger("etat", dw.getWatchableObjectInt(21));
    compound.setBoolean("owner", this.owner);
    
    }
    @Override
    public void readFromNBT(NBTTagCompound compound)
    {
    super.readFromNBT(compound);
    
    DataWatcher dw = this.getDataWatcher();
    
    this.playerID = compound.getString("playerID");
    this.playerName = compound.getString("playerName");
    this.otherID = compound.getString("otherID");
    dw.updateObject(20, compound.getInteger("color"));
    dw.updateObject(21, compound.getInteger("etat"));
    this.owner = compound.getBoolean("owner");
    }
    

    Dois-je faire ça ici, ou créer une classe qui permet de transférer tout ça ?

    (Je debute avec les nbt)


  • Correcteurs

    Ah désolé, un clap-trap je ne connais pas.

    De mon côté j'ai un item pour faire spawn l'entité et un autre pour tuer l'entité et récupérer l'item qui sert à le faire spawn.
    Ma façon de stocker après c'est adapté à mon utilisation, bref je laisse faire ceux qui en savent plus long que moi 😃



  • robin te conseille de mettre tous les tag NBT actuels de ton entity dans celui du joueur, donc regarde le tuto des ExtProp, ça t'aidera !



  • Dois y avoir plus simple

    genre elle doit être tamed donc elle est liée au joueur,

    donc simplement, tu la rend invisible et invulnérable à tout (quand le joueur déco) puis inversement dans le joueur est présent/reconnecté



  • donc un truc du genre

    si tamed et proprio n'est pas la

    • invulnerable
    • invincible

    et ce, dans le mob. Plus qu'a chercher le "proprio n'est pas la"



  • Bah pour voir si une entity n'est pas dans le monde (Joueur ou pas), c'est facile tu regardes si elle est null ^^
    Du mois je pense, c'est ce que j'aurai fait…



  • Ouai, pas faux…

    
    if (!worldObj.isRemote && playerID != null)
    {
    if (worldObj.getPlayerEntityByName(playerName) != null)
    {
    this.setInvisible(false);
    System.out.println("la");
    
    }
    else
    {
    this.setInvisible(true);
    System.out.println("pas la");
    }
    }
    

    Et le tour est joué ! ^^'...



  • Et n'oublie pas de le rendre invulnérable avec setInvulnerable, je crois 😉



  • Je n'ai pas trouver pour le mettre invulnérable malheureusement, setInvulnerable n'existe pas, seulement isInvulnerable. d’après mes recherche, c'est bien chiant a faire… Mais bon... Faut vraiment etre chanceux pour trouver une cible invisible 😕



  • Tu peux toujours override la méthode attackEntityFrom et faire un truc comme ça

    
    @Override
    public boolean attackEntityFrom(DamageSource damagSource, float ammount)
    if(entity.isInvisible)//Ou un truc du genre
    return false
    else
    return super.attackEntityFrom(damageSource, ammount);
    
    


  • Ok, merci, j'ai integré le code, on verra bien s'il est bon pendant mes test multi 😃



  • Bah normalement y a pas de raisons que sa ne marche pas ^^'
    Mais ton isInvulnerable ne marche pas ?! C est bizarre….Au pire si aucune de ces deux solutions marche pas, tu as toujours l event LivingAttackEvent, qui reste une bonne solution 😉



  • isInvulnerable ne peux pas marcher, vue que la fonction pour le rendre invincible n'a été appeler nul part 😃

    Mais je pense que ton code marchera 😃



  • Pourtant si on regarde le message #10 on voit que tu appelles bien la methode setinvisible
    Apres sers toi de la methode onLivingpdate pour check si ton entity est invisible, si oui tu passes a true isInvulnerable. Mais encore une fois c est une solution parmis tant d autres 🙂