Synchro d'items TileEntity



  • J'ai un problème que je n'arrive pas à corriger :
    J'ai une tileEntity avec un rendu TESR qui affiche les items qu'il y a dans la tileEntity. Le problème c'est que, a un moment du code de la tileEntity, le client n'est pas correctement synchronisé avec le serveur (je supprime les items contenus dans la tileEntity coté serveur et il y sont encore coté client). J'ai donc ajouter "worldObj.markBlockForUpdate(this.pos);" et "this.markDirty();" (coté serveur) pour synchroniser le contenu de la tileEntity mais cela ne fonctionne pas. Quelque chose de très bizarre : si il y as des items coté client mais pas coté serveur, et que j'ajoute un item coté serveur, l'item vas arriver coté client mais les autres items serons toujours là.

    Class de la tileEntity : pastebin

    Class du block : pastebin

    Le problème est à la fin de ma fonction "checkForCrafting()".

    EDIT : J'ai trouvé un autre endroit où j'ai ce problème : à la fin de ma fonction "ejectInvalidItems()", car la aussi, je supprime des items de la table de craft coté serveur mais il restent coté client.



  • Le problème de synchronisation se trouve dans le Gui si j'ai bien compris ?



  • @'SCAREX':

    Le problème de synchronisation se trouve dans le Gui si j'ai bien compris ?

    Pas vraiment, il y a bien un Gui mais ce n'ai pas ici le problème : le Gui ne sert que à ajouter un filtre.
    Quand je dis que "j'ajoute un item" c'est dans la fonction getActualGrid() car elle permet de récupérer les EntityItem qui sont au sol devant ma machine et les met dans l'inventaire (buffedItems)
    Et quand je dis "je supprime des items de la table de craft" je veux dire que c'est la table de craft qui supprime les item ( soit pour réaliser le craft , soit pour éjecter de la table les items qui ne sont plus valide à cause du filtre) et c'est là où il y as le problème de synchro.

    Ps : J'ai mis des commentaires dans la class de la tileEntity pour que ce soit plus claire.

    EDIT : J'ai trouver la solution :
    Dans la fonction readFromNBT, j'ai oublié de réinitialiser les listes d'Items avant d'ajouter les items contenus dans le NBTTagCompound donc quand j’essayai de synchroniser, le client gardais les items qu'il avait et ajouter par dessus les items qu'il y a coté serveur.

    :::
    public void readFromNBT(NBTTagCompound tag)
    {
        super.readFromNBT(tag);

    this.clear(); // C'est cette ligne qu'il manquais.

    NBTTagList recipeItemsTag = tag.getTagList("recipeItems", Constants.NBT.TAG_COMPOUND);

    for (int i = 0; i < recipeItemsTag.tagCount(); ++i)
        {
            NBTTagCompound nbttagcompound = recipeItemsTag.getCompoundTagAt(i);
            int slot = nbttagcompound.getInteger("Slot");
            if (slot >= 0 && slot < this.recipeItems.length)
            {
                this.recipeItems[slot] = ItemStack.loadItemStackFromNBT(nbttagcompound);
            }
        }

    NBTTagList buffedItemsTag = tag.getTagList("buffedItems", Constants.NBT.TAG_COMPOUND);

    for (int i = 0; i < buffedItemsTag.tagCount(); ++i)
        {
            NBTTagCompound nbttagcompound = buffedItemsTag.getCompoundTagAt(i);
            int slot = nbttagcompound.getInteger("Slot");
            if (slot >= 0 && slot < this.buffedItems.length)
            {
                this.buffedItems[slot] = ItemStack.loadItemStackFromNBT(nbttagcompound);
            }
        }

    }
    :::


Log in to reply