Capability не хочет работать с мобами

Версия Minecraft
1.16.5
API
Forge
9
3
Написал код по туториалу. У игрока(PlayerEntity) все данные нормально сохраняются, но в случае с мобами (например с кадавром) данные сохраняются только до перезахода в мир, после него значение опять равно нулю.

ICurrency:
public interface ICurrency {
    public int getAmount();
    public void setAmount(int amount);
    public void addOrSubtractAmount(int amount);
}
Currency:
public class Currency implements ICurrency {
    private int amount = 0;

    @Override
    public int getAmount() {
        return this.amount;
    }

    @Override
    public void setAmount(int amount) {
        this.amount = amount;

        if(this.amount < 0)
            this.amount = 0;
    }

    @Override
    public void addOrSubtractAmount(int amount) {
        this.amount += amount;

        if(this.amount < 0)
            this.amount = 0;
    }
}
CurrencyStorage:
public class CurrencyStorage implements Capability.IStorage<ICurrency> {
    @Nullable
    @Override
    public INBT writeNBT(Capability<ICurrency> capability, ICurrency instance, Direction side) {
        return IntNBT.valueOf(instance.getAmount());
    }

    @Override
    public void readNBT(Capability<ICurrency> capability, ICurrency instance, Direction side, INBT nbt) {
        if (!(instance instanceof Currency))
            throw new IllegalArgumentException("Can not deserialize to an instance that isn't the default implementation");

        instance.setAmount(((IntNBT)nbt).getAsInt());
    }
}
CurrencyCapability:
public class CurrencyCapability implements ICapabilitySerializable<IntNBT> {

    @CapabilityInject(ICurrency.class)
    public static final Capability<ICurrency> CURRENCY_CAPABILITY = null;
    private LazyOptional<ICurrency> instance = LazyOptional.of(CURRENCY_CAPABILITY::getDefaultInstance);

    public static void register()
    {
        CapabilityManager.INSTANCE.register(ICurrency.class, new CurrencyStorage(), Currency::new);
    }

    @Nonnull
    @Override
    public <T> LazyOptional<T> getCapability(@Nonnull Capability<T> cap, @Nullable Direction side) {
        return CURRENCY_CAPABILITY.orEmpty(cap, instance);
    }

    @Override
    public IntNBT serializeNBT() {
        return (IntNBT) CURRENCY_CAPABILITY.getStorage().writeNBT(CURRENCY_CAPABILITY, instance.orElseThrow(() ->
                new IllegalArgumentException("LazyOptional cannot be empty!")), null);
    }

    @Override
    public void deserializeNBT(IntNBT nbt) {
        CURRENCY_CAPABILITY.getStorage().readNBT(CURRENCY_CAPABILITY, instance.orElseThrow(() ->
                new IllegalArgumentException("LazyOptional cannot be empty!")), null, nbt);
    }
}
ExampleMod:
@Mod("examplemod")
public class ExampleMod
{
    public static final String MOD_ID = "examplemod";

    public ExampleMod() {
        FMLJavaModLoadingContext.get().getModEventBus().addListener(this::setup);
        MinecraftForge.EVENT_BUS.register(this);
    }

    @SubscribeEvent
    public void attachCapabilitiesEntity(final AttachCapabilitiesEvent<Entity> event){
        if(event.getObject() instanceof PlayerEntity || event.getObject() instanceof HuskEntity) {
            event.addCapability(new ResourceLocation(MOD_ID, "currency"), new CurrencyCapability());
        }
    }


    @SubscribeEvent
    public void onLive(EntityEvent.EnteringChunk event) {
        PlayerEntity player = Minecraft.getInstance().player;

        if(event.getEntity() instanceof HuskEntity && player != null) {
       
            ICurrency data = player.getCapability(CurrencyCapability.CURRENCY_CAPABILITY, null).orElse(null);
            if(data != null) {
                data.setAmount(data.getAmount() + 2);
                player.sendMessage(new StringTextComponent("Husk : " + data.getAmount()), player.getUUID());
            }
        }
    }

 
    private void setup(final FMLCommonSetupEvent event) {
        CurrencyCapability.register();
    }
}
 
Последнее редактирование:
Сверху