Капабилити энергии для механизма

Версия Minecraft
1.16.5
API
Forge
Хотел создать кастомный блок с тайл энтити, но при добавлении капабилити энергии создается как будто два хранилища. Когда увеличиваю значение энергии в хранилище и вывожу его в консоль, выводится два значения: 0 и правильное значение энергии. В нбт записывается именно 0, изменяя код вышло что второе значение тоже увеличивается, но при этом как-то получить и использовать его нельзя. Хранилище для энергии создал свое, наследуя его от EnergyStorage из Forge.
 

Вложения

  • SolarPanel.txt
    3.3 KB · Просмотры: 5
  • ModEnergyStorage.txt
    805 байт · Просмотры: 3
Хранилище энергии



Java:
public class ModEnergyStorage extends EnergyStorage {
    public ModEnergyStorage(int capacity, int maxReceive, int maxExtract) {
        super(capacity, maxReceive, maxExtract);
    }

    @Override
    public int receiveEnergy(int maxReceive, boolean simulate) {
        return super.receiveEnergy(maxReceive, simulate);
    }

    @Override
    public int extractEnergy(int maxExtract, boolean simulate) {
        return super.extractEnergy(maxExtract, simulate);
    }

    @Override
    public int getEnergyStored() {
        return super.getEnergyStored();
    }

    @Override
    public int getMaxEnergyStored() {
        return super.getMaxEnergyStored();
    }

    public int setEnergy(int energy) {
        this.energy = energy;
        return this.energy;
    }
}



Сам Тайл


Java:
public class SolarPanelTile extends TileEntity implements ITickableTileEntity {
    private final ItemStackHandler itemHandler = createHandler();

    private final LazyOptional<IItemHandler> handler = LazyOptional.of(()-> itemHandler);

     final ModEnergyStorage ENERGY_STORAGE = new ModEnergyStorage(10000, 256, 256);

    private LazyOptional<IEnergyStorage> energyHandler = LazyOptional.empty();



    public SolarPanelTile() {
        this(ModTileEntities.SOLAR_PANEL_TILE.get());
    }




    @Override
    public void onLoad() {
        super.onLoad();
        energyHandler = LazyOptional.of(() -> ENERGY_STORAGE);
    }

    @Override
    public void read(BlockState state, CompoundNBT nbt) {
        itemHandler.deserializeNBT(nbt.getCompound("inv"));
        ENERGY_STORAGE.setEnergy(nbt.getInt("solar_panel.energy"));
        super.read(state, nbt);
    }


    @Override
    public CompoundNBT write(CompoundNBT nbt) {
        nbt.put("inv", itemHandler.serializeNBT());
        nbt.putInt("solar_panel.energy", ENERGY_STORAGE.getEnergyStored());
        return super.write(nbt);
    }

    @Override
    public void tick() {
        if (hasSolarElement()){
                if (ENERGY_STORAGE.getEnergyStored() < ENERGY_STORAGE.getMaxEnergyStored())
                    if (world.isDaytime()) {
                        ENERGY_STORAGE.receiveEnergy(16, false);
                        System.out.println(ENERGY_STORAGE.getEnergyStored());
            }
        }
    }
    public SolarPanelTile(TileEntityType<?> p_i48289_1_) {
        super(p_i48289_1_);
    }
    private ItemStackHandler createHandler() {
        return new ItemStackHandler(1){
            @Override
            protected void onContentsChanged(int slot) {
                markDirty();
            }

            @Override
            public boolean isItemValid(int slot, @Nonnull ItemStack stack) {
                switch (slot) {
                    case 0: return stack.getItem() == ModItems.SOLAR_ELEMENT.get();
                    default: return false;
                }
            }

            @Override
            public int getSlotLimit(int slot) {
                return 1;
            }

            @Nonnull
            @Override
            public ItemStack insertItem(int slot, @Nonnull ItemStack stack, boolean simulate) {
                if (!isItemValid(slot, stack)){
                    return stack;
                }
                return super.insertItem(slot, stack, simulate);
            }
        };
    }

    @Nonnull
    @Override
    public <T> LazyOptional<T> getCapability(@Nonnull Capability<T> cap, @Nullable Direction side) {
        if (cap == CapabilityEnergy.ENERGY){
            return energyHandler.cast();
        }
        if (cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) {
            return handler.cast();
        }
        return super.getCapability(cap, side);
    }
    public boolean hasSolarElement(){
        return this.itemHandler.getStackInSlot(0).getItem() == ModItems.SOLAR_ELEMENT.get();
    }



    public ModEnergyStorage getENERGY_STORAGE() {
        return ENERGY_STORAGE;
    }


    @Override
    public void invalidateCaps() {
        super.invalidateCaps();
        handler.invalidate();
        energyHandler.invalidate();
    }
}
 
Если кому-то будет когда-то это интересно, то проблема была в том что хранилище энергии есть и на серверной части и на клиентской, сохраняется в нбт значение серверной, так что нужно просто отправлять пакет для синхронизации на клиентскую часть
 
Сверху