合并EnergyVehicleEntity
This commit is contained in:
parent
3ab3a583d1
commit
a71a03d1f7
8 changed files with 87 additions and 100 deletions
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue