- 11
- 0
Добрый день. Столкнулся с такой проблемой, как загрузка NBT. Тайл вроде бы работает, генерирует энергию, но в тот же тик она исчезает из него. На разбор я потратил около дня и так и не понял в чем суть данной проблемы. Буду рад любой помощи.
PS пробовал вводить чтение и внесение данных через read и write, но успеха все так же не оказалось, а получилось даже хуже.
TileGenerationEnergy сам тайл:
public class TileGenerationEnergy extends EnergyTileMI implements ITickableTileEntity, IEnergyEUTile {
public TileGenerationEnergy() {
super(RegisterMod.TILE_GENERATION_ENERGY.get());
}
@Override
public long getGeneration(TileEntity tile) {
return getVariant().gen;
}
@Override
public long getTransfer(TileEntity tile) {
return getVariant().transfer;
}
@Override
public long getMaxEnergyStored(TileEntity tile) {
return getVariant().cap;
}
@Override
public void tick() {
generation();
}
public void transfer(){
assert this.world != null;
if(this.world.isRemote) {
if (getEnergyStored(this.getTileEntity()) <= 0) {
for (BlockPos nearbyPos : BlockPos.getAllInBoxMutable(pos.add(-3, 0, -3), pos.add(3, 0, 3))) {
if (nearbyPos.equals(pos)) {
continue;
}
TileEntity nearbyState = world.getTileEntity(nearbyPos);
//if (nearbyState instanceof EnergyReceiverBlock) {
//EnergyReceiverBlock receiver = (EnergyReceiverBlock) nearbyState;
//receiver.transferEnergy(this.getTileEntity(), nearbyPos, energyToTransfer);
}
}
}
}
public void generation(){
assert world != null;
if(world.isRemote) {
if (world.canSeeSky(this.pos)) {
if (world.isDaytime()) {
generationEnergy(this.getTileEntity(), getGeneration(this.getTileEntity()), false);
}else{
long genNight = getGeneration(this.getTileEntity()) / 2;
generationEnergy(this.getTileEntity(), genNight, false);
}
}
}
}
@Override
public boolean isFull(TileEntity tile){
return getEnergyStored(this.getTileEntity()) >= getMaxEnergyStored(this.getTileEntity());
}
public BlockGenerationEnergy.Variant getVariant() {
Block b = this.getBlockState().getBlock();
return b instanceof BlockGenerationEnergy ? ((BlockGenerationEnergy)b).var : BlockGenerationEnergy.Variant.ADVANCED;
}
}
IEnergyEUTile - подкласс тайлов использующие энергию:
public interface IEnergyEUTile extends IForgeTileEntity {
default CompoundNBT getOrCreateEnergyTag(TileEntity entity) {
return entity.getTileData();
}
default long getEnergyStored(TileEntity tile) {
CompoundNBT tag = this.getOrCreateEnergyTag(tile);
return Math.min(tag.getLong("Energy"), this.getMaxEnergyStored(tile));
}
long getGeneration(TileEntity tile);
long getTransfer(TileEntity tile);
long getMaxEnergyStored(TileEntity tile);
boolean isFull(TileEntity tile);
default void setEnergyStored(TileEntity tile, long energy) {
CompoundNBT tag = this.getOrCreateEnergyTag(tile);
tag.putLong("Energy", (long) MathHelper.clamp(energy, 0, this.getMaxEnergyStored(tile)));
}
default long transferEnergy(TileEntity tile, long maxTransfer, boolean simulate) {
if(!simulate && getEnergyStored(tile) > 0) {
setEnergyStored(tile,getEnergyStored(tile) - maxTransfer);
}
return maxTransfer;
}
default void generationEnergy(TileEntity tile, long maxGen, boolean simulate) {
if(!simulate && !isFull(tile)) {
setEnergyStored(tile,getEnergyStored(tile) + maxGen);
}
}
}
PS пробовал вводить чтение и внесение данных через read и write, но успеха все так же не оказалось, а получилось даже хуже.