Hello everyone. I create my capability for stats and should save it after player death, but if i try to get my values i took 0!
For example
@SubscribeEvent
public void playerStatsEvent(TickEvent.PlayerTickEvent event) {
// HERE I WILL GET WRONG STATS
System.out.println(player.getCapability(StatCapability.CAPABILITY_STAT, null));
if(!player.world.isRemote()){
// HERE I WILL GET GOOD STATS
System.out.println(player.getCapability(StatCapability.CAPABILITY_STAT, null));
}
}
Cappa and Death event iclude
Interface
public interface IStat extends Callable{
int getStr();
void setStr(int stat);
void setStatsByAnotherStats(IStat stats);
void increaseStr(int statAdd);
void clearAll();
}
Class stats
public class Stat implements IStat{
private int str = 0;
@Override
public int getStr() {
return str;
}
@Override
public void setStr(int stat) {
this.str = stat;
}
@Override
public void setStatsByAnotherStats(IStat stats) {
Stat stat = (Stat) stats;
this.str = stat.str;
}
@Override
public void increaseStr(int statAdd) {
this.str += statAdd;
}
@Override
public void clearAll() {
this.str = 0;
}
@Override
public String toString(){
return "STR ->" + str;
}
@Override
public Object call() throws Exception {
return this;
}
}
Capa
public class StatCapability implements ICapabilitySerializable<NBTTagCompound> {
@CapabilityInject(IStat.class)
public static Capability<IStat> CAPABILITY_STAT;
private IStat instance = CAPABILITY_STAT.getDefaultInstance();
@Override
public boolean hasCapability(@Nonnull Capability<?> capability, @Nullable EnumFacing facing) {
return capability == CAPABILITY_STAT;
}
@Nullable
@Override
@SuppressWarnings("unchecked")
public <T> T getCapability(@Nonnull Capability<T> capability, @Nullable EnumFacing facing) {
if (capability == CAPABILITY_STAT) return (T) this.instance;
return null;
}
@Override
public NBTTagCompound serializeNBT() {
return (NBTTagCompound) CAPABILITY_STAT.getStorage().writeNBT(CAPABILITY_STAT, this.instance, null);
}
@Override
public void deserializeNBT(NBTTagCompound nbt) {
CAPABILITY_STAT.getStorage().readNBT(CAPABILITY_STAT, this.instance, null, nbt);
}
Storage
public class StatStorage implements Capability.IStorage<IStat> {
@Nullable
@Override
public NBTBase writeNBT(Capability<IStat> capability, IStat instance, EnumFacing side) {
NBTTagCompound nbt = new NBTTagCompound();
nbt.setInteger("strength", instance.getStr());
return nbt;
}
@Override
public void readNBT(Capability<IStat> capability, IStat instance, EnumFacing side, NBTBase nbt) {
NBTTagCompound tag = (NBTTagCompound) nbt;
instance.setStr(tag.getInteger("strength"));
}
}
PlayerDeath event
@SubscribeEvent
public void playerClone(PlayerEvent.Clone e) {
IStat newStat = e.getEntityPlayer().getCapability(StatCapability.CAPABILITY_STAT,null);
IStat oldStat = e.getOriginal().getCapability(StatCapability.CAPABILITY_STAT,null);
newStat.setStatsByAnotherStats(oldStat);
}
Attach
private static final ResourceLocation STATS = new ResourceLocation(Reference.MODID, "stats");
@SubscribeEvent
public void attachCapability(AttachCapabilitiesEvent<Entity> event) {
if (event.getObject() instanceof EntityPlayer)
event.addCapability(STATS, new StatCapability());
}