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();
}
}