From a71a03d1f71074662409a6f9d2a3ef2e3d06a7ab Mon Sep 17 00:00:00 2001 From: Light_Quanta Date: Sun, 13 Jul 2025 13:53:06 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=88=E5=B9=B6EnergyVehicleEntity?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/overlay/VehicleHudOverlay.java | 6 +- .../coldsweat/ColdSweatCompatHandler.java | 5 +- .../entity/vehicle/AnnihilatorEntity.java | 9 +- .../entity/vehicle/LaserTowerEntity.java | 9 +- .../vehicle/base/EnergyVehicleEntity.java | 86 ------------------- .../vehicle/base/MobileVehicleEntity.java | 7 +- .../entity/vehicle/base/VehicleEntity.java | 59 ++++++++++++- .../superbwarfare/init/ModCapabilities.java | 6 +- 8 files changed, 87 insertions(+), 100 deletions(-) delete mode 100644 src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/EnergyVehicleEntity.java diff --git a/src/main/java/com/atsuishio/superbwarfare/client/overlay/VehicleHudOverlay.java b/src/main/java/com/atsuishio/superbwarfare/client/overlay/VehicleHudOverlay.java index b70dac25a..d0199ae15 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/overlay/VehicleHudOverlay.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/overlay/VehicleHudOverlay.java @@ -99,9 +99,9 @@ public class VehicleHudOverlay implements LayeredDraw.Layer { int compatHeight = getArmorPlateCompatHeight(player); - if (vehicle instanceof EnergyVehicleEntity energyVehicleEntity) { - float energy = energyVehicleEntity.getEnergy(); - float maxEnergy = energyVehicleEntity.getMaxEnergy(); + if (vehicle instanceof VehicleEntity vehicleEntity && vehicleEntity.hasEnergyStorage()) { + float energy = vehicleEntity.getEnergy(); + float maxEnergy = vehicleEntity.getMaxEnergy(); preciseBlit(guiGraphics, ENERGY, 10, h - 22 - compatHeight, 100, 0, 0, 8, 8, 8, 8); preciseBlit(guiGraphics, HEALTH_FRAME, 20, h - 21 - compatHeight, 100, 0, 0, 60, 6, 60, 6); preciseBlit(guiGraphics, HEALTH, 20, h - 21 - compatHeight, 100, 0, 0, (int) (60 * energy / maxEnergy), 6, 60, 6); diff --git a/src/main/java/com/atsuishio/superbwarfare/compat/coldsweat/ColdSweatCompatHandler.java b/src/main/java/com/atsuishio/superbwarfare/compat/coldsweat/ColdSweatCompatHandler.java index 5c12bd3cf..b3e55e1ec 100644 --- a/src/main/java/com/atsuishio/superbwarfare/compat/coldsweat/ColdSweatCompatHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/compat/coldsweat/ColdSweatCompatHandler.java @@ -1,7 +1,7 @@ package com.atsuishio.superbwarfare.compat.coldsweat; import com.atsuishio.superbwarfare.compat.CompatHolder; -import com.atsuishio.superbwarfare.entity.vehicle.base.EnergyVehicleEntity; +import com.atsuishio.superbwarfare.entity.vehicle.base.VehicleEntity; import com.momosoftworks.coldsweat.api.util.Temperature; import net.neoforged.fml.ModList; import net.neoforged.neoforge.event.tick.PlayerTickEvent; @@ -10,7 +10,8 @@ public class ColdSweatCompatHandler { public static void onPlayerInVehicle(PlayerTickEvent.Pre event) { var player = event.getEntity(); - if (player.getVehicle() instanceof EnergyVehicleEntity vehicle + if (player.getVehicle() instanceof VehicleEntity vehicle + && vehicle.hasEnergyStorage() && vehicle.isEnclosed(vehicle.getSeatIndex(player)) && vehicle.getEnergy() > 0 ) { diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/AnnihilatorEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/AnnihilatorEntity.java index c633e0985..6149488d7 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/AnnihilatorEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/AnnihilatorEntity.java @@ -6,8 +6,8 @@ import com.atsuishio.superbwarfare.config.server.ExplosionConfig; import com.atsuishio.superbwarfare.config.server.VehicleConfig; import com.atsuishio.superbwarfare.entity.OBBEntity; import com.atsuishio.superbwarfare.entity.vehicle.base.CannonEntity; -import com.atsuishio.superbwarfare.entity.vehicle.base.EnergyVehicleEntity; import com.atsuishio.superbwarfare.entity.vehicle.base.ThirdPersonCameraPosition; +import com.atsuishio.superbwarfare.entity.vehicle.base.VehicleEntity; import com.atsuishio.superbwarfare.entity.vehicle.damage.DamageModifier; import com.atsuishio.superbwarfare.entity.vehicle.weapon.LaserWeapon; import com.atsuishio.superbwarfare.entity.vehicle.weapon.VehicleWeapon; @@ -60,7 +60,7 @@ import software.bernie.geckolib.util.GeckoLibUtil; import java.util.List; -public class AnnihilatorEntity extends EnergyVehicleEntity implements GeoEntity, CannonEntity, OBBEntity { +public class AnnihilatorEntity extends VehicleEntity implements GeoEntity, CannonEntity, OBBEntity { public static final EntityDataAccessor COOL_DOWN = SynchedEntityData.defineId(AnnihilatorEntity.class, EntityDataSerializers.INT); public static final EntityDataAccessor LASER_LEFT_LENGTH = SynchedEntityData.defineId(AnnihilatorEntity.class, EntityDataSerializers.FLOAT); @@ -637,4 +637,9 @@ public class AnnihilatorEntity extends EnergyVehicleEntity implements GeoEntity, this.obb5.center().set(new Vector3f(worldPosition5.x, worldPosition5.y, worldPosition5.z)); this.obb5.setRotation(VectorTool.combineRotationsYaw(1, this)); } + + @Override + public boolean hasEnergyStorage() { + return true; + } } diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/LaserTowerEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/LaserTowerEntity.java index 8ceed8936..9ba25cad2 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/LaserTowerEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/LaserTowerEntity.java @@ -4,7 +4,7 @@ import com.atsuishio.superbwarfare.Mod; import com.atsuishio.superbwarfare.config.server.VehicleConfig; import com.atsuishio.superbwarfare.entity.TargetEntity; import com.atsuishio.superbwarfare.entity.vehicle.base.AutoAimable; -import com.atsuishio.superbwarfare.entity.vehicle.base.EnergyVehicleEntity; +import com.atsuishio.superbwarfare.entity.vehicle.base.VehicleEntity; import com.atsuishio.superbwarfare.init.ModDamageTypes; import com.atsuishio.superbwarfare.init.ModEntities; import com.atsuishio.superbwarfare.init.ModSounds; @@ -51,7 +51,7 @@ import java.util.UUID; import static com.atsuishio.superbwarfare.tools.ParticleTool.sendParticle; import static com.atsuishio.superbwarfare.tools.SeekTool.smokeFilter; -public class LaserTowerEntity extends EnergyVehicleEntity implements GeoEntity, OwnableEntity, AutoAimable { +public class LaserTowerEntity extends VehicleEntity implements GeoEntity, OwnableEntity, AutoAimable { public static final EntityDataAccessor COOL_DOWN = SynchedEntityData.defineId(LaserTowerEntity.class, EntityDataSerializers.INT); public static final EntityDataAccessor TARGET_UUID = SynchedEntityData.defineId(LaserTowerEntity.class, EntityDataSerializers.STRING); @@ -374,4 +374,9 @@ public class LaserTowerEntity extends EnergyVehicleEntity implements GeoEntity, public @Nullable ResourceLocation getVehicleItemIcon() { return Mod.loc("textures/gui/vehicle/type/defense.png"); } + + @Override + public boolean hasEnergyStorage() { + return true; + } } 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 deleted file mode 100644 index 8384fa6aa..000000000 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/EnergyVehicleEntity.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.atsuishio.superbwarfare.entity.vehicle.base; - -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.neoforged.neoforge.energy.IEnergyStorage; - -public abstract class EnergyVehicleEntity extends VehicleEntity { - - public static final EntityDataAccessor ENERGY = SynchedEntityData.defineId(EnergyVehicleEntity.class, EntityDataSerializers.INT); - - // TODO 在数据更新时修改能量相关属性 - protected final IEnergyStorage energyStorage = new SyncedEntityEnergyStorage(this.getMaxEnergy(), this.entityData, ENERGY); - - public EnergyVehicleEntity(EntityType pEntityType, Level pLevel) { - super(pEntityType, pLevel); - this.setEnergy(0); - } - - @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); - builder.define(ENERGY, 0); - } - - - @Override - protected void readAdditionalSaveData(CompoundTag compound) { - super.readAdditionalSaveData(compound); - if (compound.get("Energy") instanceof IntTag energyNBT) { - ((SyncedEntityEnergyStorage) energyStorage).deserializeNBT(level().registryAccess(), energyNBT); - } - } - - @Override - public void addAdditionalSaveData(CompoundTag compound) { - super.addAdditionalSaveData(compound); - compound.put("Energy", ((SyncedEntityEnergyStorage) energyStorage).serializeNBT(level().registryAccess())); - } - - /** - * 消耗指定电量 - * - * @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 IEnergyStorage getEnergyStorage() { - return this.energyStorage; - } - - 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 data().maxEnergy(); - } - - // 屎 - public boolean hasEnergyStorage() { - return true; - } -} diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/MobileVehicleEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/MobileVehicleEntity.java index c67a8f528..07d6788ce 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/MobileVehicleEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/MobileVehicleEntity.java @@ -53,7 +53,7 @@ import java.util.List; import java.util.function.Consumer; import java.util.stream.StreamSupport; -public abstract class MobileVehicleEntity extends EnergyVehicleEntity implements ControllableVehicle { +public abstract class MobileVehicleEntity extends VehicleEntity implements ControllableVehicle { public static Consumer trackSound = vehicle -> { }; public static Consumer engineSound = vehicle -> { @@ -972,4 +972,9 @@ public abstract class MobileVehicleEntity extends EnergyVehicleEntity implements public boolean canCrushEntities() { return true; } + + @Override + public boolean hasEnergyStorage() { + return true; + } } diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/VehicleEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/VehicleEntity.java index f419bd756..56c016dc0 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/VehicleEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/VehicleEntity.java @@ -1,6 +1,7 @@ package com.atsuishio.superbwarfare.entity.vehicle.base; import com.atsuishio.superbwarfare.Mod; +import com.atsuishio.superbwarfare.capability.energy.SyncedEntityEnergyStorage; import com.atsuishio.superbwarfare.data.vehicle.VehicleData; import com.atsuishio.superbwarfare.entity.OBBEntity; import com.atsuishio.superbwarfare.entity.mixin.OBBHitter; @@ -29,6 +30,7 @@ import net.minecraft.core.Holder; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.IntTag; import net.minecraft.network.protocol.game.ClientboundSetPassengersPacket; import net.minecraft.network.protocol.game.ClientboundSoundPacket; import net.minecraft.network.syncher.EntityDataAccessor; @@ -61,6 +63,7 @@ import net.minecraft.world.phys.Vec3; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; import net.neoforged.neoforge.common.util.FakePlayer; +import net.neoforged.neoforge.energy.IEnergyStorage; import net.neoforged.neoforge.network.PacketDistributor; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -305,6 +308,9 @@ public abstract class VehicleEntity extends Entity { return true; } + public static final EntityDataAccessor ENERGY = SynchedEntityData.defineId(VehicleEntity.class, EntityDataSerializers.INT); + protected final IEnergyStorage energyStorage = new SyncedEntityEnergyStorage(this.getMaxEnergy(), this.entityData, ENERGY); + public VehicleEntity(EntityType pEntityType, Level pLevel) { super(pEntityType, pLevel); this.setHealth(this.getMaxHealth()); @@ -337,7 +343,50 @@ public abstract class VehicleEntity extends Entity { .define(ENGINE2_DAMAGED, false) // 怎么还不给玩动态注册了(恼) - .define(SELECTED_WEAPON, IntList.of(new int[this.getMaxPassengers()])); + .define(SELECTED_WEAPON, IntList.of(new int[this.getMaxPassengers()])) + .define(ENERGY, 0); + } + + /** + * 消耗指定电量 + * + * @param amount 要消耗的电量 + */ + protected void consumeEnergy(int amount) { + if (!this.hasEnergyStorage()) return; + this.energyStorage.extractEnergy(amount, false); + } + + protected boolean canConsume(int amount) { + if (!this.hasEnergyStorage()) return false; + return this.getEnergy() >= amount; + } + + public int getEnergy() { + return this.energyStorage.getEnergyStored(); + } + + public IEnergyStorage getEnergyStorage() { + return this.energyStorage; + } + + protected void setEnergy(int pEnergy) { + if (!this.hasEnergyStorage()) return; + 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 data().maxEnergy(); + } + + public boolean hasEnergyStorage() { + return false; } private int[] initSelectedWeaponArray(WeaponVehicleEntity weaponVehicle) { @@ -385,6 +434,10 @@ public abstract class VehicleEntity extends Entity { this.entityData.set(SELECTED_WEAPON, IntList.of(selected)); } } + + if (this.hasEnergyStorage() && compound.get("Energy") instanceof IntTag energyNBT) { + ((SyncedEntityEnergyStorage) energyStorage).deserializeNBT(level().registryAccess(), energyNBT); + } } @Override @@ -408,6 +461,10 @@ public abstract class VehicleEntity extends Entity { if (this instanceof WeaponVehicleEntity weaponVehicle && weaponVehicle.getAllWeapons().length > 0) { compound.putIntArray("SelectedWeapon", this.entityData.get(SELECTED_WEAPON)); } + + if (this.hasEnergyStorage()) { + compound.put("Energy", ((SyncedEntityEnergyStorage) energyStorage).serializeNBT(level().registryAccess())); + } } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/init/ModCapabilities.java b/src/main/java/com/atsuishio/superbwarfare/init/ModCapabilities.java index 23abeb663..fe26df868 100644 --- a/src/main/java/com/atsuishio/superbwarfare/init/ModCapabilities.java +++ b/src/main/java/com/atsuishio/superbwarfare/init/ModCapabilities.java @@ -8,7 +8,7 @@ import com.atsuishio.superbwarfare.capability.energy.ItemEnergyStorage; import com.atsuishio.superbwarfare.capability.laser.LaserCapability; import com.atsuishio.superbwarfare.capability.laser.LaserCapabilityProvider; import com.atsuishio.superbwarfare.entity.vehicle.base.ContainerMobileVehicleEntity; -import com.atsuishio.superbwarfare.entity.vehicle.base.EnergyVehicleEntity; +import com.atsuishio.superbwarfare.entity.vehicle.base.VehicleEntity; import com.atsuishio.superbwarfare.item.CreativeChargingStationBlockItem; import com.atsuishio.superbwarfare.item.EnergyStorageItem; import net.minecraft.core.Direction; @@ -80,10 +80,10 @@ public class ModCapabilities { // 载具 for (var entity : ModEntities.REGISTRY.getEntries()) { // 能量 - if (entity.get().getBaseClass().isAssignableFrom(EnergyVehicleEntity.class)) { + if (entity.get().getBaseClass().isAssignableFrom(VehicleEntity.class)) { event.registerEntity(Capabilities.EnergyStorage.ENTITY, entity.get(), - (obj, ctx) -> (obj instanceof EnergyVehicleEntity vehicle && vehicle.hasEnergyStorage()) ? vehicle.getEnergyStorage() : null + (obj, ctx) -> (obj instanceof VehicleEntity vehicle && vehicle.hasEnergyStorage()) ? vehicle.getEnergyStorage() : null ); }