I thought I did that the right way.
In total the provider implements the interface like this:
public static class TeleportBreakCapabilityProvider implements ICapabilityProvider, INBTSerializable<NBTBase> {
private final ITeleportCapability cap;
private static final DefaultTeleportStorage<ITeleportCapability> STORAGE = new DefaultTeleportStorage<>();
public TeleportBreakCapabilityProvider() {
this.cap = new TeleportCapability();
}
@Override
public NBTBase serializeNBT() {
return STORAGE.writeNBT(CAPABILITY_TELEPORT, cap, null);
}
@Override
public void deserializeNBT(NBTBase nbt) {
STORAGE.readNBT(CAPABILITY_TELEPORT, cap, null, nbt);
}
...
}
I am storing only one integer called "teleportBreak" in the nbt in DefaultTeleportStorage.
This class has been implemented like this:
public class DefaultTeleportStorage <T extends ITeleportCapability> implements Capability.IStorage<T>{
@Override
public NBTBase writeNBT(Capability<T> capability, T instance, EnumFacing side) {
NBTTagCompound nbt = new NBTTagCompound();
ITeleportCapability cap = (ITeleportCapability) instance;
nbt.setInteger("teleportBreak", cap.getFlags());
return nbt;
}
@Override
public void readNBT(Capability<T> capability, T instance, EnumFacing side, NBTBase nbt) {
NBTTagCompound tags = new NBTTagCompound();
ITeleportCapability cap = capability.cast(instance);
cap.setFlags(tags.getInteger("teleportBreak"));
}
}
It looks pretty normal to me, so I don't know what's the matter with it not working properly.