91 lines
3 KiB
Java
91 lines
3 KiB
Java
package com.atsuishio.superbwarfare.entity.vehicle;
|
|
|
|
import com.atsuishio.superbwarfare.capability.energy.SyncedEntityEnergyStorage;
|
|
import net.minecraft.nbt.CompoundTag;
|
|
import net.minecraft.nbt.IntTag;
|
|
import net.minecraft.network.syncher.EntityDataAccessor;
|
|
import net.minecraft.network.syncher.EntityDataSerializers;
|
|
import net.minecraft.network.syncher.SynchedEntityData;
|
|
import net.minecraft.util.Mth;
|
|
import net.minecraft.world.entity.EntityType;
|
|
import net.minecraft.world.level.Level;
|
|
import net.minecraftforge.common.capabilities.Capability;
|
|
import net.minecraftforge.common.capabilities.ForgeCapabilities;
|
|
import net.minecraftforge.common.util.LazyOptional;
|
|
import net.minecraftforge.energy.IEnergyStorage;
|
|
import org.jetbrains.annotations.NotNull;
|
|
|
|
public class EnergyVehicleEntity extends VehicleEntity {
|
|
|
|
public static final EntityDataAccessor<Integer> ENERGY = SynchedEntityData.defineId(EnergyVehicleEntity.class, EntityDataSerializers.INT);
|
|
|
|
protected final SyncedEntityEnergyStorage energyStorage = new SyncedEntityEnergyStorage(this.getMaxEnergy(), this.entityData, ENERGY);
|
|
protected final LazyOptional<IEnergyStorage> energy = LazyOptional.of(() -> energyStorage);
|
|
|
|
public EnergyVehicleEntity(EntityType<?> pEntityType, Level pLevel) {
|
|
super(pEntityType, pLevel);
|
|
this.setEnergy(0);
|
|
}
|
|
|
|
@Override
|
|
protected void defineSynchedData() {
|
|
super.defineSynchedData();
|
|
this.entityData.define(ENERGY, 0);
|
|
}
|
|
|
|
@Override
|
|
protected void readAdditionalSaveData(CompoundTag compound) {
|
|
super.readAdditionalSaveData(compound);
|
|
if (compound.get("Energy") instanceof IntTag energyNBT) {
|
|
energyStorage.deserializeNBT(energyNBT);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void invalidateCaps() {
|
|
super.invalidateCaps();
|
|
energy.invalidate();
|
|
}
|
|
|
|
@Override
|
|
public void addAdditionalSaveData(CompoundTag compound) {
|
|
super.addAdditionalSaveData(compound);
|
|
compound.put("Energy", energyStorage.serializeNBT());
|
|
}
|
|
|
|
/**
|
|
* 消耗指定电量
|
|
*
|
|
* @param amount 要消耗的电量
|
|
*/
|
|
public void consumeEnergy(int amount) {
|
|
this.energyStorage.extractEnergy(amount, false);
|
|
}
|
|
|
|
public boolean canConsume(int amount) {
|
|
return this.getEnergy() >= amount;
|
|
}
|
|
|
|
public int getEnergy() {
|
|
return this.energyStorage.getEnergyStored();
|
|
}
|
|
|
|
public void setEnergy(int pEnergy) {
|
|
int targetEnergy = Mth.clamp(pEnergy, 0, this.getMaxEnergy());
|
|
|
|
if (targetEnergy > energyStorage.getEnergyStored()) {
|
|
energyStorage.receiveEnergy(targetEnergy - energyStorage.getEnergyStored(), false);
|
|
} else {
|
|
energyStorage.extractEnergy(energyStorage.getEnergyStored() - targetEnergy, false);
|
|
}
|
|
}
|
|
|
|
public int getMaxEnergy() {
|
|
return 100000;
|
|
}
|
|
|
|
@Override
|
|
public @NotNull <T> LazyOptional<T> getCapability(@NotNull Capability<T> cap) {
|
|
return ForgeCapabilities.ENERGY.orEmpty(cap, energy);
|
|
}
|
|
}
|