From 4e560d22edb6cf2cde179a04af85d5c206565275 Mon Sep 17 00:00:00 2001 From: Light_Quanta Date: Sun, 30 Mar 2025 05:21:04 +0800 Subject: [PATCH] =?UTF-8?q?=E6=AD=A3=E7=A1=AE=E6=B3=A8=E5=86=8C=E9=83=A8?= =?UTF-8?q?=E5=88=86Capability?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/ChargingStationBlockEntity.java | 56 ++------ .../CreativeChargingStationBlockEntity.java | 39 +----- .../block/entity/FuMO25BlockEntity.java | 122 ++++++++---------- .../capability/ModCapabilities.java | 32 +++-- .../vehicle/base/EnergyVehicleEntity.java | 13 +- .../superbwarfare/item/BatteryItem.java | 9 ++ .../CreativeChargingStationBlockItem.java | 15 +-- 7 files changed, 120 insertions(+), 166 deletions(-) diff --git a/src/main/java/com/atsuishio/superbwarfare/block/entity/ChargingStationBlockEntity.java b/src/main/java/com/atsuishio/superbwarfare/block/entity/ChargingStationBlockEntity.java index f550f1226..e8323ce10 100644 --- a/src/main/java/com/atsuishio/superbwarfare/block/entity/ChargingStationBlockEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/block/entity/ChargingStationBlockEntity.java @@ -13,7 +13,6 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.IntTag; import net.minecraft.network.chat.Component; import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; -import net.minecraft.server.level.ServerLevel; import net.minecraft.world.Container; import net.minecraft.world.ContainerHelper; import net.minecraft.world.MenuProvider; @@ -30,7 +29,6 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; -import net.neoforged.neoforge.capabilities.BlockCapabilityCache; import net.neoforged.neoforge.capabilities.Capabilities; import net.neoforged.neoforge.capabilities.ICapabilityProvider; import net.neoforged.neoforge.energy.EnergyStorage; @@ -61,23 +59,6 @@ public class ChargingStationBlockEntity extends BlockEntity implements WorldlyCo protected NonNullList items = NonNullList.withSize(2, ItemStack.EMPTY); - private BlockCapabilityCache capCache; - - @Override - public void onLoad() { - super.onLoad(); - - if (level != null && !level.isClientSide) { - this.capCache = BlockCapabilityCache.create( - Capabilities.EnergyStorage.BLOCK, - (ServerLevel) level, - this.getBlockPos(), - null - ); - } - } - - public int fuelTick = 0; public int maxFuelTick = DEFAULT_FUEL_TIME; public boolean showRange = false; @@ -139,7 +120,7 @@ public class ChargingStationBlockEntity extends BlockEntity implements WorldlyCo setChanged(pLevel, pPos, pState); } - var handler = blockEntity.capCache.getCapability(); + var handler = blockEntity.getEnergyStorage(null); if (handler == null) return; int energy = handler.getEnergyStored(); @@ -256,10 +237,10 @@ public class ChargingStationBlockEntity extends BlockEntity implements WorldlyCo for (Direction direction : Direction.values()) { var blockEntity = this.level.getBlockEntity(this.getBlockPos().relative(direction)); - if (blockEntity == null) return; + if (blockEntity == null) continue; var energy = level.getCapability(Capabilities.EnergyStorage.BLOCK, blockEntity.getBlockPos(), direction); - if (energy == null || !(blockEntity instanceof ChargingStationBlockEntity)) return; + if (energy == null || blockEntity instanceof ChargingStationBlockEntity) return; if (energy.canReceive() && energy.getEnergyStored() < energy.getMaxEnergyStored()) { int receiveEnergy = energy.receiveEnergy(Math.min(handler.getEnergyStored(), CHARGE_OTHER_SPEED), false); @@ -279,10 +260,10 @@ public class ChargingStationBlockEntity extends BlockEntity implements WorldlyCo protected void loadAdditional(@NotNull CompoundTag tag, HolderLookup.@NotNull Provider registries) { super.loadAdditional(tag, registries); - if (tag.contains("Energy") && this.capCache.getCapability() != null) { + if (tag.contains("Energy")) { var energy = tag.get("Energy"); if (energy instanceof IntTag) { - ((EnergyStorage) this.capCache.getCapability()).deserializeNBT(registries, energy); + ((EnergyStorage) this.energyStorage).deserializeNBT(registries, energy); } } this.fuelTick = tag.getInt("FuelTick"); @@ -296,9 +277,8 @@ public class ChargingStationBlockEntity extends BlockEntity implements WorldlyCo protected void saveAdditional(@NotNull CompoundTag tag, HolderLookup.@NotNull Provider registries) { super.saveAdditional(tag, registries); - if (this.capCache != null && this.capCache.getCapability() != null) { - tag.put("Energy", IntTag.valueOf(this.capCache.getCapability().getEnergyStored())); - } + tag.putInt("Energy", this.energyStorage.getEnergyStored()); + tag.putInt("FuelTick", this.fuelTick); tag.putInt("MaxFuelTick", this.maxFuelTick); tag.putBoolean("ShowRange", this.showRange); @@ -399,17 +379,6 @@ public class ChargingStationBlockEntity extends BlockEntity implements WorldlyCo return compoundtag; } - public static class EnergyStorageProvider implements ICapabilityProvider { - - private final IEnergyStorage energy = new EnergyStorage(MAX_ENERGY); - - @Override - public @Nullable IEnergyStorage getCapability(@NotNull ChargingStationBlockEntity object, Direction context) { - return energy; - } - } - - public static class ItemHandlerProvider implements ICapabilityProvider { private IItemHandler[] itemHandlers; @@ -439,12 +408,15 @@ public class ChargingStationBlockEntity extends BlockEntity implements WorldlyCo public void saveToItem(ItemStack stack, HolderLookup.Provider registries) { CompoundTag tag = new CompoundTag(); if (this.level != null) { - var cap = level.getCapability(Capabilities.EnergyStorage.BLOCK, this.getBlockPos(), null); - if (cap instanceof EnergyStorage energy) { - tag.put("Energy", energy.serializeNBT(registries)); - } + tag.put("Energy", ((EnergyStorage) energyStorage).serializeNBT(registries)); } BlockItem.setBlockEntityData(stack, this.getType(), tag); + } + private final IEnergyStorage energyStorage = new EnergyStorage(MAX_ENERGY); + + @Nullable + public IEnergyStorage getEnergyStorage(@Nullable Direction side) { + return energyStorage; } } diff --git a/src/main/java/com/atsuishio/superbwarfare/block/entity/CreativeChargingStationBlockEntity.java b/src/main/java/com/atsuishio/superbwarfare/block/entity/CreativeChargingStationBlockEntity.java index 750d817da..a6b094f67 100644 --- a/src/main/java/com/atsuishio/superbwarfare/block/entity/CreativeChargingStationBlockEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/block/entity/CreativeChargingStationBlockEntity.java @@ -5,16 +5,12 @@ import com.atsuishio.superbwarfare.init.ModBlockEntities; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; -import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; -import net.neoforged.neoforge.capabilities.BlockCapabilityCache; import net.neoforged.neoforge.capabilities.Capabilities; -import net.neoforged.neoforge.capabilities.ICapabilityProvider; import net.neoforged.neoforge.energy.IEnergyStorage; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.List; @@ -26,21 +22,6 @@ public class CreativeChargingStationBlockEntity extends BlockEntity { public static final int CHARGE_RADIUS = 8; - private BlockCapabilityCache capCache; - - @Override - public void onLoad() { - super.onLoad(); - - if (level != null && !level.isClientSide) { - this.capCache = BlockCapabilityCache.create( - Capabilities.EnergyStorage.BLOCK, - (ServerLevel) level, - this.getBlockPos(), - null - ); - } - } public CreativeChargingStationBlockEntity(BlockPos pos, BlockState state) { super(ModBlockEntities.CREATIVE_CHARGING_STATION.get(), pos, state); @@ -49,10 +30,8 @@ public class CreativeChargingStationBlockEntity extends BlockEntity { public static void serverTick(CreativeChargingStationBlockEntity blockEntity) { if (blockEntity.level == null) return; - if (blockEntity.capCache != null) { - blockEntity.chargeEntity(); - blockEntity.chargeBlock(); - } + blockEntity.chargeEntity(); + blockEntity.chargeBlock(); } private void chargeEntity() { @@ -73,7 +52,7 @@ public class CreativeChargingStationBlockEntity extends BlockEntity { for (Direction direction : Direction.values()) { var blockEntity = this.level.getBlockEntity(this.getBlockPos().relative(direction)); - if (blockEntity == null) return; + if (blockEntity == null) continue; var energy = level.getCapability(Capabilities.EnergyStorage.BLOCK, blockEntity.getBlockPos(), direction); if (energy == null || blockEntity instanceof CreativeChargingStationBlockEntity) continue; @@ -90,14 +69,10 @@ public class CreativeChargingStationBlockEntity extends BlockEntity { return ClientboundBlockEntityDataPacket.create(this); } - public static class EnergyStorageProvider implements ICapabilityProvider { + private final IEnergyStorage energyStorage = new InfinityEnergyStorage(); - private final IEnergyStorage energy = new InfinityEnergyStorage(); - - @Override - public @Nullable IEnergyStorage getCapability(@NotNull CreativeChargingStationBlockEntity object, Direction context) { - if (object.isRemoved()) return null; - return energy; - } + @Nullable + public IEnergyStorage getEnergyStorage(@Nullable Direction side) { + return energyStorage; } } diff --git a/src/main/java/com/atsuishio/superbwarfare/block/entity/FuMO25BlockEntity.java b/src/main/java/com/atsuishio/superbwarfare/block/entity/FuMO25BlockEntity.java index 90288fc54..07df4f617 100644 --- a/src/main/java/com/atsuishio/superbwarfare/block/entity/FuMO25BlockEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/block/entity/FuMO25BlockEntity.java @@ -1,14 +1,18 @@ package com.atsuishio.superbwarfare.block.entity; +import com.atsuishio.superbwarfare.block.FuMO25Block; import com.atsuishio.superbwarfare.init.ModBlockEntities; +import com.atsuishio.superbwarfare.init.ModSounds; import com.atsuishio.superbwarfare.menu.FuMO25Menu; import com.atsuishio.superbwarfare.network.dataslot.ContainerEnergyData; import com.atsuishio.superbwarfare.tools.SeekTool; import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; +import net.minecraft.sounds.SoundSource; import net.minecraft.util.Mth; import net.minecraft.world.MenuProvider; import net.minecraft.world.effect.MobEffectInstance; @@ -22,6 +26,8 @@ import net.minecraft.world.inventory.ContainerLevelAccess; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; +import net.neoforged.neoforge.energy.EnergyStorage; +import net.neoforged.neoforge.energy.IEnergyStorage; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import software.bernie.geckolib.animatable.GeoBlockEntity; @@ -29,8 +35,10 @@ import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animation.AnimatableManager; import software.bernie.geckolib.util.GeckoLibUtil; +import javax.annotation.ParametersAreNonnullByDefault; import java.util.List; +// TODO 为什么打不开UI public class FuMO25BlockEntity extends BlockEntity implements MenuProvider, GeoBlockEntity { private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); @@ -49,7 +57,7 @@ public class FuMO25BlockEntity extends BlockEntity implements MenuProvider, GeoB public static final int MAX_DATA_COUNT = 5; -// private LazyOptional energyHandler; + private final IEnergyStorage energyStorage; public FuncType type = FuncType.NORMAL; public int time = 0; @@ -61,7 +69,7 @@ public class FuMO25BlockEntity extends BlockEntity implements MenuProvider, GeoB @Override public int get(int pIndex) { return switch (pIndex) { -// case 0 -> FuMO25BlockEntity.this.energyHandler.map(EnergyStorage::getEnergyStored).orElse(0); + case 0 -> FuMO25BlockEntity.this.energyStorage.getEnergyStored(); case 1 -> FuMO25BlockEntity.this.type.ordinal(); case 2 -> FuMO25BlockEntity.this.time; case 3 -> FuMO25BlockEntity.this.powered ? 1 : 0; @@ -73,9 +81,7 @@ public class FuMO25BlockEntity extends BlockEntity implements MenuProvider, GeoB @Override public void set(int pIndex, int pValue) { switch (pIndex) { - case 0 -> { - } -// FuMO25BlockEntity.this.energyHandler.ifPresent(handler -> handler.receiveEnergy((int) pValue, false)); + case 0 -> FuMO25BlockEntity.this.energyStorage.receiveEnergy(pValue, false); case 1 -> FuMO25BlockEntity.this.type = FuncType.values()[pValue]; case 2 -> FuMO25BlockEntity.this.time = pValue; case 3 -> FuMO25BlockEntity.this.powered = pValue == 1; @@ -91,13 +97,18 @@ public class FuMO25BlockEntity extends BlockEntity implements MenuProvider, GeoB public FuMO25BlockEntity(BlockPos pPos, BlockState pBlockState) { super(ModBlockEntities.FUMO_25.get(), pPos, pBlockState); -// this.energyHandler = LazyOptional.of(() -> new EnergyStorage(MAX_ENERGY)); + this.energyStorage = new EnergyStorage(MAX_ENERGY); + } + + public IEnergyStorage getEnergyStorage(@Nullable Direction direction) { + return this.energyStorage; } public static void serverTick(Level pLevel, BlockPos pPos, BlockState pState, T blockEntity) { var radar = (FuMO25BlockEntity) blockEntity; -// int energy = radar.energyHandler.map(EnergyStorage::getEnergyStored).orElse(0); + var energyStorage = ((FuMO25BlockEntity) blockEntity).getEnergyStorage(null); + var energy = energyStorage.getEnergyStored(); radar.tick++; FuncType funcType = radar.type; @@ -108,40 +119,40 @@ public class FuMO25BlockEntity extends BlockEntity implements MenuProvider, GeoB energyCost = DEFAULT_ENERGY_COST; } -// if (energy < energyCost) { -// if (pState.getValue(FuMO25Block.POWERED)) { -// pLevel.setBlockAndUpdate(pPos, pState.setValue(FuMO25Block.POWERED, false)); -// pLevel.playSound(null, pPos, ModSounds.RADAR_SEARCH_END.get(), SoundSource.BLOCKS, 1.0F, 1.0F); -// radar.powered = false; -// setChanged(pLevel, pPos, pState); -// } -// if (radar.time > 0) { -// radar.time = 0; -// radar.setChanged(); -// } -// } else { -// if (!pState.getValue(FuMO25Block.POWERED)) { -// if (energy >= DEFAULT_MIN_ENERGY) { -// pLevel.setBlockAndUpdate(pPos, pState.setValue(FuMO25Block.POWERED, true)); -// pLevel.playSound(null, pPos, ModSounds.RADAR_SEARCH_START.get(), SoundSource.BLOCKS, 1.0F, 1.0F); -// radar.powered = true; -// setChanged(pLevel, pPos, pState); -// } -// } else { -// radar.energyHandler.ifPresent(handler -> handler.extractEnergy(energyCost, false)); -// if (radar.tick == 200) { -// pLevel.playSound(null, pPos, ModSounds.RADAR_SEARCH_IDLE.get(), SoundSource.BLOCKS, 1.0F, 1.0F); -// } -// -// if (radar.time > 0) { -// if (radar.time % 100 == 0) { -// radar.setGlowEffect(); -// } -// radar.time--; -// radar.setChanged(); -// } -// } -// } + if (energy < energyCost) { + if (pState.getValue(FuMO25Block.POWERED)) { + pLevel.setBlockAndUpdate(pPos, pState.setValue(FuMO25Block.POWERED, false)); + pLevel.playSound(null, pPos, ModSounds.RADAR_SEARCH_END.get(), SoundSource.BLOCKS, 1.0F, 1.0F); + radar.powered = false; + setChanged(pLevel, pPos, pState); + } + if (radar.time > 0) { + radar.time = 0; + radar.setChanged(); + } + } else { + if (!pState.getValue(FuMO25Block.POWERED)) { + if (energy >= DEFAULT_MIN_ENERGY) { + pLevel.setBlockAndUpdate(pPos, pState.setValue(FuMO25Block.POWERED, true)); + pLevel.playSound(null, pPos, ModSounds.RADAR_SEARCH_START.get(), SoundSource.BLOCKS, 1.0F, 1.0F); + radar.powered = true; + setChanged(pLevel, pPos, pState); + } + } else { + energyStorage.extractEnergy(energyCost, false); + if (radar.tick == 200) { + pLevel.playSound(null, pPos, ModSounds.RADAR_SEARCH_IDLE.get(), SoundSource.BLOCKS, 1.0F, 1.0F); + } + + if (radar.time > 0) { + if (radar.time % 100 == 0) { + radar.setGlowEffect(); + } + radar.time--; + radar.setChanged(); + } + } + } if (radar.tick >= 200) { radar.tick = 0; @@ -171,8 +182,9 @@ public class FuMO25BlockEntity extends BlockEntity implements MenuProvider, GeoB protected void loadAdditional(@NotNull CompoundTag tag, HolderLookup.@NotNull Provider registries) { super.loadAdditional(tag, registries); - if (tag.contains("Energy")) { -// getCapability(Capabilities.ENERGY).ifPresent(handler -> ((EnergyStorage) handler).deserializeNBT(tag.get("Energy"))); + var energyTag = tag.get("Energy"); + if (energyTag != null) { + ((EnergyStorage) energyStorage).deserializeNBT(registries, energyTag); } this.type = FuncType.values()[Mth.clamp(tag.getInt("Type"), 0, 3)]; this.time = tag.getInt("Time"); @@ -180,10 +192,11 @@ public class FuMO25BlockEntity extends BlockEntity implements MenuProvider, GeoB } @Override + @ParametersAreNonnullByDefault protected void saveAdditional(CompoundTag tag, HolderLookup.Provider registries) { super.saveAdditional(tag, registries); -// getCapability(Capabilities.ENERGY).ifPresent(handler -> tag.put("Energy", ((EnergyStorage) handler).serializeNBT())); + tag.put("Energy", ((EnergyStorage) energyStorage).serializeNBT(registries)); tag.putInt("Type", this.type.ordinal()); tag.putInt("Time", this.time); tag.putBoolean("Powered", this.powered); @@ -206,27 +219,6 @@ public class FuMO25BlockEntity extends BlockEntity implements MenuProvider, GeoB return ClientboundBlockEntityDataPacket.create(this); } -// @Override -// public LazyOptional getCapability(Capability cap, Direction side) { -// if (cap == Capabilities.ENERGY) { -// return energyHandler.cast(); -// } -// return super.getCapability(cap, side); -// } -// -// @Override -// public void invalidateCapabilities() { -// this.energyHandler.invalidate(); -// super.invalidateCapabilities(); -// } -// -// -// @Override -// public void reviveCaps() { -// super.reviveCaps(); -// this.energyHandler = LazyOptional.of(() -> new EnergyStorage(MAX_ENERGY)); -// } - @Override public void registerControllers(AnimatableManager.ControllerRegistrar controllers) { } diff --git a/src/main/java/com/atsuishio/superbwarfare/capability/ModCapabilities.java b/src/main/java/com/atsuishio/superbwarfare/capability/ModCapabilities.java index 39c60e3ee..895e64eff 100644 --- a/src/main/java/com/atsuishio/superbwarfare/capability/ModCapabilities.java +++ b/src/main/java/com/atsuishio/superbwarfare/capability/ModCapabilities.java @@ -3,13 +3,14 @@ package com.atsuishio.superbwarfare.capability; import com.atsuishio.superbwarfare.Mod; import com.atsuishio.superbwarfare.block.entity.ChargingStationBlockEntity; import com.atsuishio.superbwarfare.block.entity.CreativeChargingStationBlockEntity; -import com.atsuishio.superbwarfare.capability.energy.BlockEnergyStorageProvider; -import com.atsuishio.superbwarfare.capability.energy.ItemEnergyProvider; +import com.atsuishio.superbwarfare.block.entity.FuMO25BlockEntity; import com.atsuishio.superbwarfare.capability.laser.LaserCapability; import com.atsuishio.superbwarfare.capability.laser.LaserCapabilityProvider; import com.atsuishio.superbwarfare.capability.player.PlayerVariable; import com.atsuishio.superbwarfare.capability.player.PlayerVariablesProvider; +import com.atsuishio.superbwarfare.entity.vehicle.base.EnergyVehicleEntity; import com.atsuishio.superbwarfare.init.ModBlockEntities; +import com.atsuishio.superbwarfare.init.ModEntities; import com.atsuishio.superbwarfare.init.ModItems; import com.atsuishio.superbwarfare.item.BatteryItem; import com.atsuishio.superbwarfare.item.CreativeChargingStationBlockItem; @@ -33,24 +34,37 @@ public class ModCapabilities { event.registerEntity(ModCapabilities.PLAYER_VARIABLE, EntityType.PLAYER, new PlayerVariablesProvider()); // 充电站 - event.registerBlockEntity(Capabilities.EnergyStorage.BLOCK, ModBlockEntities.CHARGING_STATION.value(), new BlockEnergyStorageProvider<>(ChargingStationBlockEntity.MAX_ENERGY)); - // TODO HANDLER + event.registerBlockEntity(Capabilities.EnergyStorage.BLOCK, ModBlockEntities.CHARGING_STATION.value(), ChargingStationBlockEntity::getEnergyStorage); + // TODO ITEM HANDLER event.registerBlockEntity(Capabilities.ItemHandler.BLOCK, ModBlockEntities.CHARGING_STATION.value(), new ChargingStationBlockEntity.ItemHandlerProvider()); // 创造模式充电站 - event.registerBlockEntity(Capabilities.EnergyStorage.BLOCK, ModBlockEntities.CREATIVE_CHARGING_STATION.value(), new CreativeChargingStationBlockEntity.EnergyStorageProvider()); - event.registerItem(Capabilities.EnergyStorage.ITEM, new CreativeChargingStationBlockItem.EnergyStorageProvider(), ModItems.CREATIVE_CHARGING_STATION.value()); + event.registerBlockEntity(Capabilities.EnergyStorage.BLOCK, ModBlockEntities.CREATIVE_CHARGING_STATION.value(), CreativeChargingStationBlockEntity::getEnergyStorage); + event.registerItem(Capabilities.EnergyStorage.ITEM, (obj, ctx) -> ((CreativeChargingStationBlockItem) obj.getItem()).getEnergyStorage(), ModItems.CREATIVE_CHARGING_STATION.value()); + + // FuMO25 + event.registerBlockEntity(Capabilities.EnergyStorage.BLOCK, ModBlockEntities.FUMO_25.value(), FuMO25BlockEntity::getEnergyStorage); // 电池 + // TODO 电池到底怎么回事 for (var item : ModItems.ITEMS.getEntries()) { if (item.get() instanceof BatteryItem battery) { - event.registerItem(Capabilities.EnergyStorage.ITEM, new ItemEnergyProvider(battery.maxEnergy), battery); + event.registerItem(Capabilities.EnergyStorage.ITEM, + (obj, ctx) -> ((BatteryItem) obj.getItem()).getEnergyStorage(), + battery + ); } } // 载具 - // TODO 载具能量 -// event.registerEntity(Capabilities.EnergyStorage.ENTITY, ModEntities., ); + for (var entity : ModEntities.REGISTRY.getEntries()) { + if (entity.get().getBaseClass().isAssignableFrom(EnergyVehicleEntity.class)) { + event.registerEntity(Capabilities.EnergyStorage.ENTITY, + entity.get(), + (obj, ctx) -> (obj instanceof EnergyVehicleEntity vehicle) ? vehicle.getEnergyStorage() : null + ); + } + } } } diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/EnergyVehicleEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/EnergyVehicleEntity.java index ce72a7825..8971a9369 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/EnergyVehicleEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/EnergyVehicleEntity.java @@ -11,14 +11,11 @@ import net.minecraft.world.entity.EntityType; import net.minecraft.world.level.Level; import net.neoforged.neoforge.energy.IEnergyStorage; -import java.util.function.Supplier; - public abstract class EnergyVehicleEntity extends VehicleEntity { public static final EntityDataAccessor ENERGY = SynchedEntityData.defineId(EnergyVehicleEntity.class, EntityDataSerializers.INT); - protected final SyncedEntityEnergyStorage energyStorage = new SyncedEntityEnergyStorage(this.getMaxEnergy(), this.entityData, ENERGY); - protected final Supplier energy = () -> energyStorage; + protected final IEnergyStorage energyStorage = new SyncedEntityEnergyStorage(this.getMaxEnergy(), this.entityData, ENERGY); public EnergyVehicleEntity(EntityType pEntityType, Level pLevel) { super(pEntityType, pLevel); @@ -36,14 +33,14 @@ public abstract class EnergyVehicleEntity extends VehicleEntity { protected void readAdditionalSaveData(CompoundTag compound) { super.readAdditionalSaveData(compound); if (compound.get("Energy") instanceof IntTag energyNBT) { - energyStorage.deserializeNBT(level().registryAccess(), energyNBT); + ((SyncedEntityEnergyStorage) energyStorage).deserializeNBT(level().registryAccess(), energyNBT); } } @Override public void addAdditionalSaveData(CompoundTag compound) { super.addAdditionalSaveData(compound); - compound.put("Energy", energyStorage.serializeNBT(level().registryAccess())); + compound.put("Energy", ((SyncedEntityEnergyStorage) energyStorage).serializeNBT(level().registryAccess())); } /** @@ -63,6 +60,10 @@ public abstract class EnergyVehicleEntity extends VehicleEntity { return this.energyStorage.getEnergyStored(); } + public IEnergyStorage getEnergyStorage() { + return this.energyStorage; + } + public void setEnergy(int pEnergy) { int targetEnergy = Mth.clamp(pEnergy, 0, this.getMaxEnergy()); diff --git a/src/main/java/com/atsuishio/superbwarfare/item/BatteryItem.java b/src/main/java/com/atsuishio/superbwarfare/item/BatteryItem.java index 8f421416d..c61d7cd47 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/BatteryItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/BatteryItem.java @@ -5,6 +5,8 @@ import net.minecraft.world.inventory.tooltip.TooltipComponent; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.neoforged.neoforge.capabilities.Capabilities; +import net.neoforged.neoforge.energy.EnergyStorage; +import net.neoforged.neoforge.energy.IEnergyStorage; import org.jetbrains.annotations.NotNull; import java.util.Optional; @@ -13,9 +15,16 @@ public class BatteryItem extends Item { public int maxEnergy; + public IEnergyStorage getEnergyStorage() { + return energy; + } + + private final IEnergyStorage energy; + public BatteryItem(int maxEnergy, Properties properties) { super(properties.stacksTo(1)); this.maxEnergy = maxEnergy; + this.energy = new EnergyStorage(maxEnergy); } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/item/CreativeChargingStationBlockItem.java b/src/main/java/com/atsuishio/superbwarfare/item/CreativeChargingStationBlockItem.java index 7b1327144..c3161366c 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/CreativeChargingStationBlockItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/CreativeChargingStationBlockItem.java @@ -2,13 +2,9 @@ package com.atsuishio.superbwarfare.item; import com.atsuishio.superbwarfare.capability.energy.InfinityEnergyStorage; import com.atsuishio.superbwarfare.init.ModBlocks; -import com.atsuishio.superbwarfare.init.ModItems; import net.minecraft.world.item.BlockItem; -import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Rarity; -import net.neoforged.neoforge.capabilities.ICapabilityProvider; import net.neoforged.neoforge.energy.IEnergyStorage; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public class CreativeChargingStationBlockItem extends BlockItem { @@ -17,15 +13,10 @@ public class CreativeChargingStationBlockItem extends BlockItem { super(ModBlocks.CREATIVE_CHARGING_STATION.get(), new Properties().rarity(Rarity.EPIC).stacksTo(1)); } - public static class EnergyStorageProvider implements ICapabilityProvider { + private final IEnergyStorage energy = new InfinityEnergyStorage(); - private final IEnergyStorage energy = new InfinityEnergyStorage(); - - @Override - public @Nullable IEnergyStorage getCapability(@NotNull ItemStack object, Void context) { - if (object.getItem() != ModItems.CREATIVE_CHARGING_STATION.get()) return null; - return energy; - } + public @Nullable IEnergyStorage getEnergyStorage() { + return energy; } }