合并EnergyVehicleEntity

This commit is contained in:
Light_Quanta 2025-07-13 13:53:06 +08:00
parent 3ab3a583d1
commit a71a03d1f7
No known key found for this signature in database
GPG key ID: 11A39A1B8C890959
8 changed files with 87 additions and 100 deletions

View file

@ -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);

View file

@ -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
) {

View file

@ -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<Integer> COOL_DOWN = SynchedEntityData.defineId(AnnihilatorEntity.class, EntityDataSerializers.INT);
public static final EntityDataAccessor<Float> 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;
}
}

View file

@ -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<Integer> COOL_DOWN = SynchedEntityData.defineId(LaserTowerEntity.class, EntityDataSerializers.INT);
public static final EntityDataAccessor<String> 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;
}
}

View file

@ -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<Integer> 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;
}
}

View file

@ -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<MobileVehicleEntity> trackSound = vehicle -> {
};
public static Consumer<MobileVehicleEntity> engineSound = vehicle -> {
@ -972,4 +972,9 @@ public abstract class MobileVehicleEntity extends EnergyVehicleEntity implements
public boolean canCrushEntities() {
return true;
}
@Override
public boolean hasEnergyStorage() {
return true;
}
}

View file

@ -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<Integer> 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

View file

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