22 déc. 2017, 11:31

@‘robin4002’:

La fonction register est appelé quelque part ?
Elle devrait l’être dans la classe init de ta classe principale.

Oui elle est bien appelée dans le Init et d’ailleurs la capability se crée bien et se save bien dans le NBT mais c’est comme si à la connection la valeur stockée dans le NBT n’était pas lue et du coup remplacée par la valeur par défault.

De ce que je vois c’est surement du à la fonction deserializeNBT qui n’est jamais appelée.

Voila toute la classe de la capabilitie, peut être y verras tu plus clair avec ça :

:::


package fr.frinn.coliseum.capability;

import java.util.concurrent.Callable;

import fr.frinn.coliseum.common.Coliseum;
import fr.frinn.coliseum.network.PacketCapability;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.nbt.NBTBase;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.EnumFacing;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.capabilities.CapabilityManager;
import net.minecraftforge.common.capabilities.ICapabilityProvider;
import net.minecraftforge.common.capabilities.ICapabilitySerializable;

public class MobKillCapability implements ICapabilityProvider, ICapabilitySerializable <nbttagcompound>{

    @Override
    public NBTTagCompound serializeNBT() {
        NBTTagCompound compound = new NBTTagCompound();
        compound.setInteger("Mob Kill", this.getMobKill());
        return compound;
    }

    @Override
    public void deserializeNBT(NBTTagCompound compound) {
        this.setMobKill(compound.getInteger("Mob Kill"));
    }

    @Override
    public boolean hasCapability(Capability capability, EnumFacing facing) {
        return Coliseum.MOB_KILL_CAP != null && capability == Coliseum.MOB_KILL_CAP;
    }

    @Override
    public <t>T getCapability(Capability <t>capability, EnumFacing facing) {
        return Coliseum.MOB_KILL_CAP != null && capability == Coliseum.MOB_KILL_CAP ? (T)this : null;
    }

    public int mobkill;

    public void setMobKill(int mobkill)
    {
        this.mobkill = mobkill;
    }

    public int getMobKill()
    {
        return this.mobkill;
    }

    public static class Storage implements Capability.IStorage <mobkillcapability>{

        @Override
        public NBTBase writeNBT(Capability <mobkillcapability>capability, MobKillCapability instance, EnumFacing side)
        {
            System.out.println("write");
            return instance.serializeNBT();
        }

        @Override
        public void readNBT(Capability <mobkillcapability>capability, MobKillCapability instance, EnumFacing side, NBTBase nbt)
        {
            System.out.println("read");
            instance.deserializeNBT((NBTTagCompound)nbt);
        }

    }

    public static class Factory implements Callable <mobkillcapability>{
        @Override
        public MobKillCapability call() throws Exception
        {
            return null;
        }
    }

    private EntityPlayer player;

    public static void register()
    {
        CapabilityManager.INSTANCE.register(MobKillCapability.class, new MobKillCapability.Storage(), new MobKillCapability.Factory());
    }

    public MobKillCapability(EntityPlayer player)
    {
        this.mobkill = 0;
        this.player = player;
    }

    public void sync()
    {
        PacketCapability packet = new PacketCapability(this.getMobKill());

        EntityPlayerMP playerMP = (EntityPlayerMP) player;

        Coliseum.network.sendTo(packet, playerMP);
    }
}

:::

Coliseum est le nom de ma classe principale et MOB_KILL_CAP c’est ce qui est défini dans le @CapabilityInject</mobkillcapability></mobkillcapability></mobkillcapability></mobkillcapability></t></t></nbttagcompound>