- 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();
}
}
Последнее редактирование: