From 7bbf8138c97335c618bd01d344c69ce96a1d8e13 Mon Sep 17 00:00:00 2001 From: Atsuihsio <842960157@qq.com> Date: Fri, 27 Dec 2024 23:20:02 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=BD=BD=E5=85=B7=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/layer/AnnihilatorPowerLayer.java | 5 +- .../layer/AnnihilatorPowerLightLayer.java | 5 +- .../client/layer/Mk42DamageLayer.java | 3 +- .../client/layer/Mle1934DamageLayer.java | 3 +- .../client/layer/SpeedBoatPowerLayer.java | 4 +- .../client/model/entity/AnnihilatorModel.java | 3 +- .../client/screens/VehicleHudOverlay.java | 17 +- .../config/server/CannonConfig.java | 16 +- .../entity/AnnihilatorEntity.java | 152 ++++---------- .../superbwarfare/entity/ClaymoreEntity.java | 4 +- .../entity/EnergyVehicleEntity.java | 62 ++++++ .../superbwarfare/entity/IChargeEntity.java | 2 - .../superbwarfare/entity/IVehicleEntity.java | 4 - .../superbwarfare/entity/Mk42Entity.java | 121 +++-------- .../superbwarfare/entity/Mle1934Entity.java | 119 +++-------- .../entity/MobileVehicleEntity.java | 93 +-------- .../superbwarfare/entity/SpeedboatEntity.java | 113 +++-------- .../superbwarfare/entity/VehicleEntity.java | 188 ++++++++++++++++++ .../entity/WheelChairEntity.java | 128 +++++------- 19 files changed, 462 insertions(+), 580 deletions(-) create mode 100644 src/main/java/com/atsuishio/superbwarfare/entity/EnergyVehicleEntity.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/entity/VehicleEntity.java diff --git a/src/main/java/com/atsuishio/superbwarfare/client/layer/AnnihilatorPowerLayer.java b/src/main/java/com/atsuishio/superbwarfare/client/layer/AnnihilatorPowerLayer.java index 14410d768..bf7cabca7 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/layer/AnnihilatorPowerLayer.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/layer/AnnihilatorPowerLayer.java @@ -1,7 +1,6 @@ package com.atsuishio.superbwarfare.client.layer; import com.atsuishio.superbwarfare.ModUtils; -import com.atsuishio.superbwarfare.config.server.CannonConfig; import com.atsuishio.superbwarfare.entity.AnnihilatorEntity; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; @@ -25,8 +24,8 @@ public class AnnihilatorPowerLayer extends GeoRenderLayer { @Override public void render(PoseStack poseStack, AnnihilatorEntity animatable, BakedGeoModel bakedModel, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay) { RenderType glowRenderType = RenderType.entityTranslucent(LAYER); - float red = 1 - Mth.clamp(2.5f * animatable.getEntityData().get(AnnihilatorEntity.ENERGY)/ CannonConfig.ANNIHILATOR_MAX_ENERGY.get().floatValue(),0,1); - float green = Mth.clamp(2.5f * animatable.getEntityData().get(AnnihilatorEntity.ENERGY)/ CannonConfig.ANNIHILATOR_MAX_ENERGY.get().floatValue(),0,1); + float red = 1 - Mth.clamp(2.5f * animatable.getEnergy()/ animatable.getMaxEnergy(),0,1); + float green = Mth.clamp(2.5f * animatable.getEnergy()/ animatable.getMaxEnergy(),0,1); getRenderer().reRender(getDefaultBakedModel(animatable), poseStack, bufferSource, animatable, glowRenderType, bufferSource.getBuffer(glowRenderType), partialTick, packedLight, OverlayTexture.NO_OVERLAY, red, green, 0, 1); } } diff --git a/src/main/java/com/atsuishio/superbwarfare/client/layer/AnnihilatorPowerLightLayer.java b/src/main/java/com/atsuishio/superbwarfare/client/layer/AnnihilatorPowerLightLayer.java index 9f428d1cb..3371d3668 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/layer/AnnihilatorPowerLightLayer.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/layer/AnnihilatorPowerLightLayer.java @@ -1,7 +1,6 @@ package com.atsuishio.superbwarfare.client.layer; import com.atsuishio.superbwarfare.ModUtils; -import com.atsuishio.superbwarfare.config.server.CannonConfig; import com.atsuishio.superbwarfare.entity.AnnihilatorEntity; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; @@ -25,8 +24,8 @@ public class AnnihilatorPowerLightLayer extends GeoRenderLayer { @Override public void render(PoseStack poseStack, Mk42Entity animatable, BakedGeoModel bakedModel, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay) { RenderType glowRenderType = RenderType.entityTranslucent(LAYER); - float heal = Mth.clamp((0.3f * CannonConfig.MK42_HP.get() - animatable.getEntityData().get(Mk42Entity.HEALTH)) * 0.00001f * CannonConfig.MK42_HP.get(), 0f, 1); + float heal = Mth.clamp((0.3f * animatable.getMaxHealth() - animatable.getHealth()) * 0.00001f * animatable.getMaxHealth(), 0, 1); getRenderer().reRender(getDefaultBakedModel(animatable), poseStack, bufferSource, animatable, glowRenderType, bufferSource.getBuffer(glowRenderType), partialTick, packedLight, OverlayTexture.NO_OVERLAY, 1, 1, 1, heal); } } diff --git a/src/main/java/com/atsuishio/superbwarfare/client/layer/Mle1934DamageLayer.java b/src/main/java/com/atsuishio/superbwarfare/client/layer/Mle1934DamageLayer.java index 744a6a1cd..52bce5391 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/layer/Mle1934DamageLayer.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/layer/Mle1934DamageLayer.java @@ -1,7 +1,6 @@ package com.atsuishio.superbwarfare.client.layer; import com.atsuishio.superbwarfare.ModUtils; -import com.atsuishio.superbwarfare.config.server.CannonConfig; import com.atsuishio.superbwarfare.entity.Mle1934Entity; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; @@ -25,7 +24,7 @@ public class Mle1934DamageLayer extends GeoRenderLayer { @Override public void render(PoseStack poseStack, Mle1934Entity animatable, BakedGeoModel bakedModel, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay) { RenderType glowRenderType = RenderType.entityTranslucent(LAYER); - float heal = Mth.clamp((0.3f * CannonConfig.MLE1934_HP.get() - animatable.getEntityData().get(Mle1934Entity.HEALTH)) * 0.00001f * CannonConfig.MLE1934_HP.get(), 0, 1); + float heal = Mth.clamp((0.3f * animatable.getMaxHealth() - animatable.getHealth()) * 0.00001f * animatable.getMaxHealth(), 0, 1); getRenderer().reRender(getDefaultBakedModel(animatable), poseStack, bufferSource, animatable, glowRenderType, bufferSource.getBuffer(glowRenderType), partialTick, packedLight, OverlayTexture.NO_OVERLAY, 1, 1, 1, heal); } } diff --git a/src/main/java/com/atsuishio/superbwarfare/client/layer/SpeedBoatPowerLayer.java b/src/main/java/com/atsuishio/superbwarfare/client/layer/SpeedBoatPowerLayer.java index 397894419..403b2556b 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/layer/SpeedBoatPowerLayer.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/layer/SpeedBoatPowerLayer.java @@ -12,8 +12,6 @@ import software.bernie.geckolib.cache.object.BakedGeoModel; import software.bernie.geckolib.renderer.GeoRenderer; import software.bernie.geckolib.renderer.layer.GeoRenderLayer; -import static com.atsuishio.superbwarfare.entity.SpeedboatEntity.ENERGY; - public class SpeedBoatPowerLayer extends GeoRenderLayer { private static final ResourceLocation LAYER = ModUtils.loc("textures/entity/speedboat_power.png"); @@ -24,7 +22,7 @@ public class SpeedBoatPowerLayer extends GeoRenderLayer { @Override public void render(PoseStack poseStack, SpeedboatEntity animatable, BakedGeoModel bakedModel, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay) { - if (animatable.getEntityData().get(ENERGY) <= 0) return; + if (animatable.getEnergy() <= 0) return; RenderType glowRenderType = RenderType.eyes(LAYER); getRenderer().reRender(getDefaultBakedModel(animatable), poseStack, bufferSource, animatable, glowRenderType, bufferSource.getBuffer(glowRenderType), partialTick, packedLight, OverlayTexture.NO_OVERLAY, 1, 1, 1, 1); } diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/entity/AnnihilatorModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/entity/AnnihilatorModel.java index 6a66a758e..7abc3a90b 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/model/entity/AnnihilatorModel.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/entity/AnnihilatorModel.java @@ -1,7 +1,6 @@ package com.atsuishio.superbwarfare.client.model.entity; import com.atsuishio.superbwarfare.ModUtils; -import com.atsuishio.superbwarfare.config.server.CannonConfig; import com.atsuishio.superbwarfare.entity.AnnihilatorEntity; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; @@ -74,7 +73,7 @@ public class AnnihilatorModel extends GeoModel { CoreGeoBone ledRed5 = getAnimationProcessor().getBone("ledred5"); float coolDown = animatable.getEntityData().get(COOL_DOWN); - boolean cantShoot = animatable.getEntityData().get(ENERGY) < CannonConfig.ANNIHILATOR_SHOOT_COST.get().floatValue(); + boolean cantShoot = animatable.getEnergy() < animatable.getMaxEnergy(); ledGreen.setHidden(coolDown > 80 || cantShoot); ledGreen2.setHidden(coolDown > 60 || cantShoot); diff --git a/src/main/java/com/atsuishio/superbwarfare/client/screens/VehicleHudOverlay.java b/src/main/java/com/atsuishio/superbwarfare/client/screens/VehicleHudOverlay.java index 30d89f8d5..a89f2cf21 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/screens/VehicleHudOverlay.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/screens/VehicleHudOverlay.java @@ -1,10 +1,7 @@ package com.atsuishio.superbwarfare.client.screens; import com.atsuishio.superbwarfare.ModUtils; -import com.atsuishio.superbwarfare.entity.ICannonEntity; -import com.atsuishio.superbwarfare.entity.IChargeEntity; -import com.atsuishio.superbwarfare.entity.IVehicleEntity; -import com.atsuishio.superbwarfare.entity.SpeedboatEntity; +import com.atsuishio.superbwarfare.entity.*; import com.atsuishio.superbwarfare.init.ModItems; import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; @@ -57,17 +54,17 @@ public class VehicleHudOverlay { GuiGraphics guiGraphics = event.getGuiGraphics(); guiGraphics.pose().pushPose(); - if (vehicle instanceof IChargeEntity iCharge) { - energy = iCharge.getEnergy(); - maxEnergy = iCharge.getMaxEnergy(); + if (vehicle instanceof EnergyVehicleEntity energyVehicleEntity) { + energy = energyVehicleEntity.getEnergy(); + maxEnergy = energyVehicleEntity.getMaxEnergy(); guiGraphics.blit(ENERGY, w - 96, h - 28, 0, 0, 12, 12, 12, 12); guiGraphics.blit(HEALTH_FRAME, w - 83, h - 26, 0, 0, 80, 8, 80, 8); guiGraphics.blit(HEALTH, w - 83, h - 26, 0, 0, (int) (80 * energy / maxEnergy), 8, 80, 8); } - if (vehicle instanceof IVehicleEntity iVehicle) { - health = iVehicle.getHealth(); - maxHealth = iVehicle.getMaxHealth(); + if (vehicle instanceof VehicleEntity pVehicle) { + health = pVehicle.getHealth(); + maxHealth = pVehicle.getMaxHealth(); guiGraphics.blit(ARMOR, w - 96, h - 14, 0, 0, 12, 12, 12, 12); guiGraphics.blit(HEALTH_FRAME, w - 83, h - 12, 0, 0, 80, 8, 80, 8); guiGraphics.blit(HEALTH, w - 83, h - 12, 0, 0, (int) (80 * health / maxHealth), 8, 80, 8); diff --git a/src/main/java/com/atsuishio/superbwarfare/config/server/CannonConfig.java b/src/main/java/com/atsuishio/superbwarfare/config/server/CannonConfig.java index 16333f3ca..8b6030edb 100644 --- a/src/main/java/com/atsuishio/superbwarfare/config/server/CannonConfig.java +++ b/src/main/java/com/atsuishio/superbwarfare/config/server/CannonConfig.java @@ -21,12 +21,12 @@ public class CannonConfig { public static ForgeConfigSpec.IntValue MLE1934_HE_EXPLOSION_RADIUS; public static ForgeConfigSpec.IntValue ANNIHILATOR_HP; - public static ForgeConfigSpec.DoubleValue ANNIHILATOR_SHOOT_COST; - public static ForgeConfigSpec.DoubleValue ANNIHILATOR_MAX_ENERGY; + public static ForgeConfigSpec.IntValue ANNIHILATOR_SHOOT_COST; + public static ForgeConfigSpec.IntValue ANNIHILATOR_MAX_ENERGY; public static ForgeConfigSpec.IntValue SPEEDBOAT_HP; - public static ForgeConfigSpec.DoubleValue SPEEDBOAT_ENERGY_COST; - public static ForgeConfigSpec.DoubleValue SPEEDBOAT_MAX_ENERGY; + public static ForgeConfigSpec.IntValue SPEEDBOAT_ENERGY_COST; + public static ForgeConfigSpec.IntValue SPEEDBOAT_MAX_ENERGY; public static ForgeConfigSpec.IntValue SPEEDBOAT_GUN_DAMAGE; public static void init(ForgeConfigSpec.Builder builder) { @@ -86,10 +86,10 @@ public class CannonConfig { ANNIHILATOR_HP = builder.defineInRange("annihilator_hp", 4000, 1, 10000000); builder.comment("The energy cost of Annihilator per shoot"); - ANNIHILATOR_SHOOT_COST = builder.defineInRange("annihilator_shoot_cost", 2000000d, 0d, Double.POSITIVE_INFINITY); + ANNIHILATOR_SHOOT_COST = builder.defineInRange("annihilator_shoot_cost", 2000000, 0, 2147483647); builder.comment("The max energy storage of Annihilator"); - ANNIHILATOR_MAX_ENERGY = builder.defineInRange("annihilator_max_energy", 20000000d, 0d, Double.POSITIVE_INFINITY); + ANNIHILATOR_MAX_ENERGY = builder.defineInRange("annihilator_max_energy", 20000000, 0, 2147483647); builder.pop(); @@ -99,10 +99,10 @@ public class CannonConfig { SPEEDBOAT_HP = builder.defineInRange("speedboat_hp", 300, 1, 10000000); builder.comment("The energy cost of Speedboat per control tick"); - SPEEDBOAT_ENERGY_COST = builder.defineInRange("speedboat_energy_cost", 1d, 0d, Double.POSITIVE_INFINITY); + SPEEDBOAT_ENERGY_COST = builder.defineInRange("speedboat_energy_cost", 1, 0, 2147483647); builder.comment("The max energy storage of Speedboat"); - SPEEDBOAT_MAX_ENERGY = builder.defineInRange("speedboat_max_energy", 100000d, 0d, Double.POSITIVE_INFINITY); + SPEEDBOAT_MAX_ENERGY = builder.defineInRange("speedboat_max_energy", 100000, 0, 2147483647); builder.comment("The gun damage of Speedboat"); SPEEDBOAT_GUN_DAMAGE = builder.defineInRange("speedboat_gun_damage", 45, 1, 10000000); diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/AnnihilatorEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/AnnihilatorEntity.java index fefcf6d27..9cdd87568 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/AnnihilatorEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/AnnihilatorEntity.java @@ -25,11 +25,12 @@ import net.minecraft.util.Mth; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.damagesource.DamageSource; -import net.minecraft.world.damagesource.DamageTypes; -import net.minecraft.world.entity.*; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.MoverType; import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.projectile.ProjectileUtil; -import net.minecraft.world.entity.projectile.ThrownPotion; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.ClipContext; import net.minecraft.world.level.Explosion; @@ -51,24 +52,17 @@ import software.bernie.geckolib.util.GeckoLibUtil; import java.util.Comparator; -public class AnnihilatorEntity extends Entity implements GeoEntity, ICannonEntity, IChargeEntity { - +public class AnnihilatorEntity extends EnergyVehicleEntity implements GeoEntity, ICannonEntity { public static final EntityDataAccessor COOL_DOWN = SynchedEntityData.defineId(AnnihilatorEntity.class, EntityDataSerializers.INT); - public static final EntityDataAccessor HEALTH = SynchedEntityData.defineId(AnnihilatorEntity.class, EntityDataSerializers.FLOAT); public static final EntityDataAccessor LASER_LEFT_LENGTH = SynchedEntityData.defineId(AnnihilatorEntity.class, EntityDataSerializers.FLOAT); public static final EntityDataAccessor LASER_MIDDLE_LENGTH = SynchedEntityData.defineId(AnnihilatorEntity.class, EntityDataSerializers.FLOAT); public static final EntityDataAccessor LASER_RIGHT_LENGTH = SynchedEntityData.defineId(AnnihilatorEntity.class, EntityDataSerializers.FLOAT); - public static final EntityDataAccessor ENERGY = SynchedEntityData.defineId(AnnihilatorEntity.class, EntityDataSerializers.FLOAT); public static final EntityDataAccessor OFFSET_ANGLE = SynchedEntityData.defineId(AnnihilatorEntity.class, EntityDataSerializers.FLOAT); private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); public static final float MAX_HEALTH = CannonConfig.ANNIHILATOR_HP.get(); - public static final float MAX_ENERGY = CannonConfig.ANNIHILATOR_MAX_ENERGY.get().floatValue(); - public static final float SHOOT_COST = CannonConfig.ANNIHILATOR_SHOOT_COST.get().floatValue(); - - protected int interpolationSteps; - protected double serverYRot; - protected double serverXRot; + public static final int MAX_ENERGY = CannonConfig.ANNIHILATOR_MAX_ENERGY.get(); + public static final int SHOOT_COST = CannonConfig.ANNIHILATOR_SHOOT_COST.get(); public Vec3 barrelLookAt; public AnnihilatorEntity(PlayMessages.SpawnEntity packet, Level world) { @@ -82,31 +76,24 @@ public class AnnihilatorEntity extends Entity implements GeoEntity, ICannonEntit @Override protected void defineSynchedData() { + super.defineSynchedData(); this.entityData.define(COOL_DOWN, 0); - this.entityData.define(HEALTH, MAX_HEALTH); this.entityData.define(LASER_LEFT_LENGTH, 0f); this.entityData.define(LASER_MIDDLE_LENGTH, 0f); this.entityData.define(LASER_RIGHT_LENGTH, 0f); - this.entityData.define(ENERGY, 0f); this.entityData.define(OFFSET_ANGLE, 0f); } @Override public void addAdditionalSaveData(CompoundTag compound) { + super.addAdditionalSaveData(compound); compound.putInt("CoolDown", this.entityData.get(COOL_DOWN)); - compound.putFloat("Health", this.entityData.get(HEALTH)); - compound.putFloat("Energy", this.entityData.get(ENERGY)); } @Override public void readAdditionalSaveData(CompoundTag compound) { + super.readAdditionalSaveData(compound); this.entityData.set(COOL_DOWN, compound.getInt("CoolDown")); - this.entityData.set(ENERGY, compound.getFloat("Energy")); - if (compound.contains("Health")) { - this.entityData.set(HEALTH, compound.getFloat("Health")); - } else { - this.entityData.set(HEALTH, MAX_HEALTH); - } } @Override @@ -118,16 +105,6 @@ public class AnnihilatorEntity extends Entity implements GeoEntity, ICannonEntit } } - @Override - public boolean canBeCollidedWith() { - return true; - } - - @Override - public boolean canCollideWith(Entity pEntity) { - return (pEntity.canBeCollidedWith() || pEntity.isPushable()) && !this.isPassengerOfSameVehicle(pEntity); - } - @Override public Packet getAddEntityPacket() { return NetworkHooks.getEntitySpawningPacket(this); @@ -140,49 +117,30 @@ public class AnnihilatorEntity extends Entity implements GeoEntity, ICannonEntit @Override public boolean hurt(DamageSource source, float amount) { + super.hurt(source, amount); if (this.level() instanceof ServerLevel serverLevel) { ParticleTool.sendParticle(serverLevel, ModParticleTypes.FIRE_STAR.get(), this.getX(), this.getY() + 2.5, this.getZ(), 4, 0.2, 0.2, 0.2, 0.2, false); } - if (source.getDirectEntity() instanceof ThrownPotion || source.getDirectEntity() instanceof AreaEffectCloud) - return false; - if (source.is(DamageTypes.FALL)) - return false; - if (source.is(DamageTypes.CACTUS)) - return false; - if (source.is(DamageTypes.DROWN)) - return false; - if (source.is(DamageTypes.LIGHTNING_BOLT)) - return false; - if (source.is(DamageTypes.FALLING_ANVIL)) - return false; - if (source.is(DamageTypes.DRAGON_BREATH)) - return false; - if (source.is(DamageTypes.WITHER)) - return false; - if (source.is(DamageTypes.WITHER_SKULL)) - return false; if (source.is(ModDamageTypes.PROJECTILE_BOOM)) { amount *= 0.5f; } if (source.is(ModDamageTypes.CANNON_FIRE)) { amount *= 1.4f; } + if (source.is(ModDamageTypes.GUN_FIRE)) { + amount = 0; + } if (source.is(ModDamageTypes.GUN_FIRE_ABSOLUTE)) { - amount *= 1.6f; + amount *= 0.1f; } this.level().playSound(null, this.getOnPos(), ModSounds.HIT.get(), SoundSource.PLAYERS, 1, 1); - this.entityData.set(HEALTH, this.entityData.get(HEALTH) - 0.5f * Math.max(amount - 40, 0)); + this.hurt(0.5f * Math.max(amount - 40, 0)); return true; } - @Override - public boolean isPickable() { - return !this.isRemoved(); - } - @Override public InteractionResult interact(Player player, InteractionHand hand) { if (player.isShiftKeyDown()) { @@ -228,21 +186,21 @@ public class AnnihilatorEntity extends Entity implements GeoEntity, ICannonEntit } if (this.level() instanceof ServerLevel serverLevel) { - if (this.entityData.get(HEALTH) <= 0.4 * CannonConfig.ANNIHILATOR_HP.get()) { + if (this.getHealth() <= 0.4 * this.getMaxHealth()) { ParticleTool.sendParticle(serverLevel, ParticleTypes.LARGE_SMOKE, this.getX(), this.getY() + 2.5, this.getZ(), 2, 0.75, 0.5, 0.75, 0.01, false); } - if (this.entityData.get(HEALTH) <= 0.25 * CannonConfig.ANNIHILATOR_HP.get()) { + if (this.getHealth() <= 0.25 * this.getMaxHealth()) { ParticleTool.sendParticle(serverLevel, ParticleTypes.LARGE_SMOKE, this.getX(), this.getY() + 2.5, this.getZ(), 1, 0.75, 0.5, 0.75, 0.01, false); ParticleTool.sendParticle(serverLevel, ParticleTypes.CAMPFIRE_COSY_SMOKE, this.getX(), this.getY() + 2.5, this.getZ(), 1, 0.75, 0.5, 0.75, 0.01, false); } - if (this.entityData.get(HEALTH) <= 0.15 * CannonConfig.ANNIHILATOR_HP.get()) { + if (this.getHealth() <= 0.15 * this.getMaxHealth()) { ParticleTool.sendParticle(serverLevel, ParticleTypes.LARGE_SMOKE, this.getX(), this.getY() + 2.5, this.getZ(), 1, 0.75, 0.5, 0.75, 0.01, false); ParticleTool.sendParticle(serverLevel, ParticleTypes.CAMPFIRE_COSY_SMOKE, this.getX(), this.getY() + 2.5, this.getZ(), 1, 0.75, 0.5, 0.75, 0.01, false); } - if (this.entityData.get(HEALTH) <= 0.1 * CannonConfig.ANNIHILATOR_HP.get()) { + if (this.getHealth() <= 0.1 * this.getMaxHealth()) { ParticleTool.sendParticle(serverLevel, ParticleTypes.LARGE_SMOKE, this.getX(), this.getY() + 2.5, this.getZ(), 2, 0.75, 0.5, 0.75, 0.01, false); ParticleTool.sendParticle(serverLevel, ParticleTypes.CAMPFIRE_COSY_SMOKE, this.getX(), this.getY() + 2.5, this.getZ(), 2, 0.75, 0.5, 0.75, 0.01, false); ParticleTool.sendParticle(serverLevel, ParticleTypes.FLAME, this.getX(), this.getY() + 3.2, this.getZ(), 4, 0.6, 0.1, 0.6, 0.05, false); @@ -250,9 +208,9 @@ public class AnnihilatorEntity extends Entity implements GeoEntity, ICannonEntit if (this.tickCount % 15 == 0) { this.level().playSound(null, this.getOnPos(), SoundEvents.FIRE_AMBIENT, SoundSource.PLAYERS, 1, 1); } - this.entityData.set(HEALTH, this.entityData.get(HEALTH) - 0.1f); + this.hurt(0.1f); } else { - this.entityData.set(HEALTH, Math.min(this.entityData.get(HEALTH) + 0.05f, MAX_HEALTH)); + this.heal(0.05f); } } @@ -266,11 +224,6 @@ public class AnnihilatorEntity extends Entity implements GeoEntity, ICannonEntit yRotO = delta + getYRot(); } - if (this.entityData.get(HEALTH) <= 0) { - this.ejectPassengers(); - destroy(); - } - float yRot = this.getYRot(); if (yRot < 0) { yRot += 360; @@ -313,8 +266,6 @@ public class AnnihilatorEntity extends Entity implements GeoEntity, ICannonEntit // travel(); // } - travel(); - Entity passenger = this.getPassengers().isEmpty() ? null : this.getPassengers().get(0); if (passenger instanceof ServerPlayer serverPlayer && this.entityData.get(COOL_DOWN) == 20) { @@ -386,16 +337,19 @@ public class AnnihilatorEntity extends Entity implements GeoEntity, ICannonEntit ParticleTool.spawnHugeExplosionParticles(this.level(), pos); } - private void destroy() { - CustomExplosion explosion = new CustomExplosion(this.level(), this, - ModDamageTypes.causeProjectileBoomDamage(this.level().registryAccess(), this, this), 160f, - this.getX(), this.getY(), this.getZ(), 20f, ExplosionDestroyConfig.EXPLOSION_DESTROY.get() ? Explosion.BlockInteraction.DESTROY : Explosion.BlockInteraction.KEEP).setDamageMultiplier(1); - explosion.explode(); - net.minecraftforge.event.ForgeEventFactory.onExplosionStart(this.level(), explosion); - explosion.finalizeExplosion(false); - ParticleTool.spawnHugeExplosionParticles(this.level(), this.position()); - - this.discard(); + @Override + public void destroy() { + if (level() instanceof ServerLevel) { + Entity attacker = EntityFindUtil.findEntity(this.level(), this.entityData.get(LAST_ATTACKER_UUID)); + CustomExplosion explosion = new CustomExplosion(this.level(), attacker == null ? this : attacker, + ModDamageTypes.causeCustomExplosionDamage(this.level().registryAccess(), attacker == null ? this : attacker, attacker == null ? this : attacker), 200.0f, + this.getX(), this.getY(), this.getZ(), 15f, ExplosionDestroyConfig.EXPLOSION_DESTROY.get() ? Explosion.BlockInteraction.DESTROY : Explosion.BlockInteraction.KEEP).setDamageMultiplier(1); + explosion.explode(); + net.minecraftforge.event.ForgeEventFactory.onExplosionStart(this.level(), explosion); + explosion.finalizeExplosion(false); + ParticleTool.spawnHugeExplosionParticles(this.level(), this.position()); + this.discard(); + } } @Override @@ -404,7 +358,7 @@ public class AnnihilatorEntity extends Entity implements GeoEntity, ICannonEntit return; } - if (this.entityData.get(ENERGY) < SHOOT_COST) { + if (this.getEnergy() < SHOOT_COST) { player.displayClientMessage(Component.literal("Not Enough Energy!"), true); return; } @@ -421,7 +375,7 @@ public class AnnihilatorEntity extends Entity implements GeoEntity, ICannonEntit this.entityData.set(COOL_DOWN, 100); - this.entityData.set(ENERGY, this.entityData.get(ENERGY) - SHOOT_COST); + this.extraEnergy(SHOOT_COST); final Vec3 center = new Vec3(this.getX(), this.getEyeY(), this.getZ()); @@ -435,16 +389,10 @@ public class AnnihilatorEntity extends Entity implements GeoEntity, ICannonEntit } @Override - public void lerpTo(double x, double y, double z, float yaw, float pitch, int interpolationSteps, boolean interpolate) { - serverYRot = yaw; - serverXRot = pitch; - this.interpolationSteps = 10; - } - public void travel() { Entity passenger = this.getPassengers().isEmpty() ? null : this.getPassengers().get(0); if (!(passenger instanceof LivingEntity entity)) return; - if (this.entityData.get(ENERGY) <= 0) return; + if (this.getEnergy() <= 0) return; float yRot = this.getYRot(); if (yRot < 0) { @@ -552,34 +500,14 @@ public class AnnihilatorEntity extends Entity implements GeoEntity, ICannonEntit return this.cache; } - @Override - public void charge(int amount) { - this.entityData.set(ENERGY, Math.min(this.entityData.get(ENERGY) + amount, CannonConfig.ANNIHILATOR_MAX_ENERGY.get().floatValue())); - } - - @Override - public boolean canCharge() { - return this.entityData.get(ENERGY) < MAX_ENERGY; - } - - @Override - public int getEnergy() { - return this.entityData.get(ENERGY).intValue(); - } - @Override public int getMaxEnergy() { - return (int) MAX_ENERGY; - } - - @Override - public float getHealth() { - return this.entityData.get(HEALTH).intValue(); + return MAX_ENERGY; } @Override public float getMaxHealth() { - return (int) MAX_HEALTH; + return MAX_HEALTH; } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/ClaymoreEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/ClaymoreEntity.java index 1cf78534f..dbbc5cc8f 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/ClaymoreEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/ClaymoreEntity.java @@ -230,8 +230,8 @@ public class ClaymoreEntity extends Entity implements GeoEntity, AnimatedEntity, public void destroy() { if (level() instanceof ServerLevel) { Entity attacker = EntityFindUtil.findEntity(this.level(), this.entityData.get(LAST_ATTACKER_UUID)); - CustomExplosion explosion = new CustomExplosion(this.level(), attacker, - ModDamageTypes.causeCustomExplosionDamage(this.level().registryAccess(), attacker, attacker), 25.0f, + CustomExplosion explosion = new CustomExplosion(this.level(), attacker == null ? this : attacker, + ModDamageTypes.causeCustomExplosionDamage(this.level().registryAccess(), attacker == null ? this : attacker, attacker == null ? this : attacker), 25.0f, this.getX(), this.getY(), this.getZ(), 5f, ExplosionDestroyConfig.EXPLOSION_DESTROY.get() ? Explosion.BlockInteraction.DESTROY : Explosion.BlockInteraction.KEEP).setDamageMultiplier(1); explosion.explode(); net.minecraftforge.event.ForgeEventFactory.onExplosionStart(this.level(), explosion); diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/EnergyVehicleEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/EnergyVehicleEntity.java new file mode 100644 index 000000000..2ce193de1 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/entity/EnergyVehicleEntity.java @@ -0,0 +1,62 @@ +package com.atsuishio.superbwarfare.entity; + +import net.minecraft.nbt.CompoundTag; +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 org.joml.Math; + +public class EnergyVehicleEntity extends VehicleEntity implements IChargeEntity { + public static final EntityDataAccessor ENERGY = SynchedEntityData.defineId(EnergyVehicleEntity.class, EntityDataSerializers.INT); + public EnergyVehicleEntity(EntityType pEntityType, Level pLevel) { + super(pEntityType, pLevel); + this.setEnergy(0); + } + + @Override + protected void defineSynchedData() { + super.defineSynchedData(); + this.entityData.define(ENERGY, this.getMaxEnergy()); + } + + @Override + protected void readAdditionalSaveData(CompoundTag compound) { + super.readAdditionalSaveData(compound); + this.entityData.set(ENERGY, compound.getInt("Energy")); + } + + @Override + public void addAdditionalSaveData(CompoundTag compound) { + super.addAdditionalSaveData(compound); + compound.putFloat("Energy", this.entityData.get(ENERGY)); + } + + public void extraEnergy(int extraAmount) { + this.setEnergy(this.getEnergy() - extraAmount); + } + + public int getEnergy() { + return this.entityData.get(ENERGY); + } + + public void setEnergy(int pEnergy) { + this.entityData.set(ENERGY, Mth.clamp(pEnergy, 0, this.getMaxEnergy())); + } + + public int getMaxEnergy() { + return 100000; + } + + @Override + public void charge(int amount) { + this.setEnergy(Math.min(this.getEnergy() + amount, this.getMaxEnergy())); + } + + @Override + public boolean canCharge() { + return this.getEnergy() < this.getMaxEnergy(); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/IChargeEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/IChargeEntity.java index ab3bac34f..526aff3ea 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/IChargeEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/IChargeEntity.java @@ -5,6 +5,4 @@ public interface IChargeEntity { void charge(int amount); boolean canCharge(); - int getEnergy(); - int getMaxEnergy(); } diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/IVehicleEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/IVehicleEntity.java index 577d29658..b6fe04b78 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/IVehicleEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/IVehicleEntity.java @@ -6,10 +6,6 @@ public interface IVehicleEntity { void vehicleShoot(Player player); - float getHealth(); - - float getMaxHealth(); - boolean isDriver(Player player); int mainGunRpm(); diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/Mk42Entity.java b/src/main/java/com/atsuishio/superbwarfare/entity/Mk42Entity.java index 158d63ddb..1acc780e4 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/Mk42Entity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/Mk42Entity.java @@ -9,6 +9,7 @@ import com.atsuishio.superbwarfare.item.ContainerBlockItem; import com.atsuishio.superbwarfare.item.common.ammo.CannonShellItem; import com.atsuishio.superbwarfare.network.message.ShakeClientMessage; import com.atsuishio.superbwarfare.tools.CustomExplosion; +import com.atsuishio.superbwarfare.tools.EntityFindUtil; import com.atsuishio.superbwarfare.tools.ParticleTool; import com.atsuishio.superbwarfare.tools.SoundTool; import net.minecraft.core.particles.ParticleTypes; @@ -26,10 +27,8 @@ import net.minecraft.util.Mth; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.damagesource.DamageSource; -import net.minecraft.world.damagesource.DamageTypes; import net.minecraft.world.entity.*; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.entity.projectile.ThrownPotion; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Explosion; import net.minecraft.world.level.Level; @@ -50,18 +49,11 @@ import software.bernie.geckolib.util.GeckoLibUtil; import java.util.Comparator; -public class Mk42Entity extends Entity implements GeoEntity, ICannonEntity { - +public class Mk42Entity extends VehicleEntity implements GeoEntity, ICannonEntity { public static final EntityDataAccessor COOL_DOWN = SynchedEntityData.defineId(Mk42Entity.class, EntityDataSerializers.INT); - public static final EntityDataAccessor HEALTH = SynchedEntityData.defineId(Mk42Entity.class, EntityDataSerializers.FLOAT); private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - public static final float MAX_HEALTH = CannonConfig.MK42_HP.get(); - protected int interpolationSteps; - protected double serverYRot; - protected double serverXRot; - public Mk42Entity(PlayMessages.SpawnEntity packet, Level world) { this(ModEntities.MK_42.get(), world); } @@ -72,34 +64,20 @@ public class Mk42Entity extends Entity implements GeoEntity, ICannonEntity { @Override protected void defineSynchedData() { + super.defineSynchedData(); this.entityData.define(COOL_DOWN, 0); - this.entityData.define(HEALTH, MAX_HEALTH); } @Override public void addAdditionalSaveData(CompoundTag compound) { + super.addAdditionalSaveData(compound); compound.putInt("CoolDown", this.entityData.get(COOL_DOWN)); - compound.putFloat("Health", this.entityData.get(HEALTH)); } @Override - public void readAdditionalSaveData(CompoundTag compound) { + protected void readAdditionalSaveData(CompoundTag compound) { + super.readAdditionalSaveData(compound); this.entityData.set(COOL_DOWN, compound.getInt("CoolDown")); - if (compound.contains("Health")) { - this.entityData.set(HEALTH, compound.getFloat("Health")); - } else { - this.entityData.set(HEALTH, MAX_HEALTH); - } - } - - @Override - public boolean canBeCollidedWith() { - return true; - } - - @Override - public boolean canCollideWith(Entity pEntity) { - return (pEntity.canBeCollidedWith() || pEntity.isPushable()) && !this.isPassengerOfSameVehicle(pEntity); } @Override @@ -119,49 +97,29 @@ public class Mk42Entity extends Entity implements GeoEntity, ICannonEntity { @Override public boolean hurt(DamageSource source, float amount) { + super.hurt(source, amount); if (this.level() instanceof ServerLevel serverLevel) { ParticleTool.sendParticle(serverLevel, ModParticleTypes.FIRE_STAR.get(), this.getX(), this.getY() + 2.5, this.getZ(), 4, 0.2, 0.2, 0.2, 0.2, false); } - if (source.getDirectEntity() instanceof ThrownPotion || source.getDirectEntity() instanceof AreaEffectCloud) - return false; - if (source.is(DamageTypes.FALL)) - return false; - if (source.is(DamageTypes.CACTUS)) - return false; - if (source.is(DamageTypes.DROWN)) - return false; - if (source.is(DamageTypes.LIGHTNING_BOLT)) - return false; - if (source.is(DamageTypes.FALLING_ANVIL)) - return false; - if (source.is(DamageTypes.DRAGON_BREATH)) - return false; - if (source.is(DamageTypes.WITHER)) - return false; - if (source.is(DamageTypes.WITHER_SKULL)) - return false; if (source.is(ModDamageTypes.PROJECTILE_BOOM)) { amount *= 0.5f; } if (source.is(ModDamageTypes.CANNON_FIRE)) { amount *= 1.4f; } + if (source.is(ModDamageTypes.GUN_FIRE)) { + amount *= 0.1f; + } if (source.is(ModDamageTypes.GUN_FIRE_ABSOLUTE)) { - amount *= 1.6f; + amount *= 0.5f; } this.level().playSound(null, this.getOnPos(), ModSounds.HIT.get(), SoundSource.PLAYERS, 1, 1); - this.entityData.set(HEALTH, this.entityData.get(HEALTH) - 0.5f * Math.max(amount - 5, 0)); - + this.hurt(0.5f * Math.max(amount - 5, 0)); return true; } - @Override - public boolean isPickable() { - return !this.isRemoved(); - } - @Override public InteractionResult interact(Player player, InteractionHand hand) { if (player.isShiftKeyDown()) { @@ -207,27 +165,27 @@ public class Mk42Entity extends Entity implements GeoEntity, ICannonEntity { this.setDeltaMovement(this.getDeltaMovement().add(0.0, -0.04, 0.0)); } - if (this.entityData.get(HEALTH) <= 0.4 * CannonConfig.MK42_HP.get()) { + if (this.getHealth() <= 0.4 * this.getMaxHealth()) { if (this.level() instanceof ServerLevel serverLevel) { ParticleTool.sendParticle(serverLevel, ParticleTypes.LARGE_SMOKE, this.getX(), this.getY() + 2.5, this.getZ(), 2, 0.75, 0.5, 0.75, 0.01, false); } } - if (this.entityData.get(HEALTH) <= 0.25 * CannonConfig.MK42_HP.get()) { + if (this.getHealth() <= 0.25 * this.getMaxHealth()) { if (this.level() instanceof ServerLevel serverLevel) { ParticleTool.sendParticle(serverLevel, ParticleTypes.LARGE_SMOKE, this.getX(), this.getY() + 2.5, this.getZ(), 1, 0.75, 0.5, 0.75, 0.01, false); ParticleTool.sendParticle(serverLevel, ParticleTypes.CAMPFIRE_COSY_SMOKE, this.getX(), this.getY() + 2.5, this.getZ(), 1, 0.75, 0.5, 0.75, 0.01, false); } } - if (this.entityData.get(HEALTH) <= 0.15 * CannonConfig.MK42_HP.get()) { + if (this.getHealth() <= 0.15 * this.getMaxHealth()) { if (this.level() instanceof ServerLevel serverLevel) { ParticleTool.sendParticle(serverLevel, ParticleTypes.LARGE_SMOKE, this.getX(), this.getY() + 2.5, this.getZ(), 1, 0.75, 0.5, 0.75, 0.01, false); ParticleTool.sendParticle(serverLevel, ParticleTypes.CAMPFIRE_COSY_SMOKE, this.getX(), this.getY() + 2.5, this.getZ(), 1, 0.75, 0.5, 0.75, 0.01, false); } } - if (this.entityData.get(HEALTH) <= 0.1 * CannonConfig.MK42_HP.get()) { + if (this.getHealth() <= 0.1 * this.getMaxHealth()) { if (this.level() instanceof ServerLevel serverLevel) { ParticleTool.sendParticle(serverLevel, ParticleTypes.LARGE_SMOKE, this.getX(), this.getY() + 2.5, this.getZ(), 2, 0.75, 0.5, 0.75, 0.01, false); ParticleTool.sendParticle(serverLevel, ParticleTypes.CAMPFIRE_COSY_SMOKE, this.getX(), this.getY() + 2.5, this.getZ(), 2, 0.75, 0.5, 0.75, 0.01, false); @@ -237,30 +195,27 @@ public class Mk42Entity extends Entity implements GeoEntity, ICannonEntity { if (this.tickCount % 15 == 0) { this.level().playSound(null, this.getOnPos(), SoundEvents.FIRE_AMBIENT, SoundSource.PLAYERS, 1, 1); } - this.entityData.set(HEALTH, this.entityData.get(HEALTH) - 0.1f); + this.hurt(0.1f); } else { - this.entityData.set(HEALTH, Math.min(this.entityData.get(HEALTH) + 0.05f, MAX_HEALTH)); + this.heal(0.05f); } - if (this.entityData.get(HEALTH) <= 0) { - this.ejectPassengers(); - destroy(); - } - - travel(); this.refreshDimensions(); } - private void destroy() { - CustomExplosion explosion = new CustomExplosion(this.level(), this, - ModDamageTypes.causeProjectileBoomDamage(this.level().registryAccess(), this, this), 130f, - this.getX(), this.getY(), this.getZ(), 9.5f, ExplosionDestroyConfig.EXPLOSION_DESTROY.get() ? Explosion.BlockInteraction.DESTROY : Explosion.BlockInteraction.KEEP).setDamageMultiplier(1); - explosion.explode(); - net.minecraftforge.event.ForgeEventFactory.onExplosionStart(this.level(), explosion); - explosion.finalizeExplosion(false); - ParticleTool.spawnHugeExplosionParticles(this.level(), this.position()); - - this.discard(); + @Override + public void destroy() { + if (level() instanceof ServerLevel) { + Entity attacker = EntityFindUtil.findEntity(this.level(), this.entityData.get(LAST_ATTACKER_UUID)); + CustomExplosion explosion = new CustomExplosion(this.level(), attacker == null ? this : attacker, + ModDamageTypes.causeCustomExplosionDamage(this.level().registryAccess(), attacker == null ? this : attacker, attacker == null ? this : attacker), 150.0f, + this.getX(), this.getY(), this.getZ(), 6f, ExplosionDestroyConfig.EXPLOSION_DESTROY.get() ? Explosion.BlockInteraction.DESTROY : Explosion.BlockInteraction.KEEP).setDamageMultiplier(1); + explosion.explode(); + net.minecraftforge.event.ForgeEventFactory.onExplosionStart(this.level(), explosion); + explosion.finalizeExplosion(false); + ParticleTool.spawnMediumExplosionParticles(this.level(), this.position()); + this.discard(); + } } @Override @@ -358,12 +313,6 @@ public class Mk42Entity extends Entity implements GeoEntity, ICannonEntity { } @Override - public void lerpTo(double x, double y, double z, float yaw, float pitch, int interpolationSteps, boolean interpolate) { - serverYRot = yaw; - serverXRot = pitch; - this.interpolationSteps = 10; - } - public void travel() { Entity passenger = this.getPassengers().isEmpty() ? null : this.getPassengers().get(0); @@ -379,7 +328,6 @@ public class Mk42Entity extends Entity implements GeoEntity, ICannonEntity { } protected void clampRotation(Entity entity) { - float f = Mth.wrapDegrees(entity.getXRot()); float f1 = Mth.clamp(f, -85.0F, 16.3F); entity.xRotO += f1 - f; @@ -408,14 +356,9 @@ public class Mk42Entity extends Entity implements GeoEntity, ICannonEntity { return this.cache; } - @Override - public float getHealth() { - return this.entityData.get(HEALTH).intValue(); - } - @Override public float getMaxHealth() { - return (int) MAX_HEALTH; + return MAX_HEALTH; } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/Mle1934Entity.java b/src/main/java/com/atsuishio/superbwarfare/entity/Mle1934Entity.java index 2e29bbdea..f819c7a40 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/Mle1934Entity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/Mle1934Entity.java @@ -9,6 +9,7 @@ import com.atsuishio.superbwarfare.item.ContainerBlockItem; import com.atsuishio.superbwarfare.item.common.ammo.CannonShellItem; import com.atsuishio.superbwarfare.network.message.ShakeClientMessage; import com.atsuishio.superbwarfare.tools.CustomExplosion; +import com.atsuishio.superbwarfare.tools.EntityFindUtil; import com.atsuishio.superbwarfare.tools.ParticleTool; import com.atsuishio.superbwarfare.tools.SoundTool; import net.minecraft.core.particles.ParticleTypes; @@ -26,10 +27,8 @@ import net.minecraft.util.Mth; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.damagesource.DamageSource; -import net.minecraft.world.damagesource.DamageTypes; import net.minecraft.world.entity.*; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.entity.projectile.ThrownPotion; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Explosion; import net.minecraft.world.level.Level; @@ -51,19 +50,13 @@ import software.bernie.geckolib.util.GeckoLibUtil; import java.util.Comparator; -public class Mle1934Entity extends Entity implements GeoEntity, ICannonEntity { +public class Mle1934Entity extends VehicleEntity implements GeoEntity, ICannonEntity { public static final EntityDataAccessor COOL_DOWN = SynchedEntityData.defineId(Mle1934Entity.class, EntityDataSerializers.INT); public static final EntityDataAccessor TYPE = SynchedEntityData.defineId(Mle1934Entity.class, EntityDataSerializers.INT); - public static final EntityDataAccessor HEALTH = SynchedEntityData.defineId(Mle1934Entity.class, EntityDataSerializers.FLOAT); private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - public static final float MAX_HEALTH = CannonConfig.MLE1934_HP.get(); - protected int interpolationSteps; - protected double serverYRot; - protected double serverXRot; - public Mle1934Entity(PlayMessages.SpawnEntity packet, Level world) { this(ModEntities.MLE_1934.get(), world); } @@ -74,37 +67,23 @@ public class Mle1934Entity extends Entity implements GeoEntity, ICannonEntity { @Override protected void defineSynchedData() { + super.defineSynchedData(); this.entityData.define(COOL_DOWN, 0); this.entityData.define(TYPE, 0); - this.entityData.define(HEALTH, MAX_HEALTH); } @Override public void addAdditionalSaveData(CompoundTag compound) { + super.addAdditionalSaveData(compound); compound.putInt("CoolDown", this.entityData.get(COOL_DOWN)); compound.putInt("Type", this.entityData.get(TYPE)); - compound.putFloat("Health", this.entityData.get(HEALTH)); } @Override public void readAdditionalSaveData(CompoundTag compound) { + super.readAdditionalSaveData(compound); this.entityData.set(COOL_DOWN, compound.getInt("CoolDown")); this.entityData.set(TYPE, compound.getInt("Type")); - if (compound.contains("Health")) { - this.entityData.set(HEALTH, compound.getFloat("Health")); - } else { - this.entityData.set(HEALTH, MAX_HEALTH); - } - } - - @Override - public boolean canBeCollidedWith() { - return true; - } - - @Override - public boolean canCollideWith(Entity pEntity) { - return (pEntity.canBeCollidedWith() || pEntity.isPushable()) && !this.isPassengerOfSameVehicle(pEntity); } @Override @@ -133,49 +112,29 @@ public class Mle1934Entity extends Entity implements GeoEntity, ICannonEntity { @Override public boolean hurt(DamageSource source, float amount) { + super.hurt(source, amount); if (this.level() instanceof ServerLevel serverLevel) { ParticleTool.sendParticle(serverLevel, ModParticleTypes.FIRE_STAR.get(), this.getX(), this.getY() + 2.5, this.getZ(), 4, 0.2, 0.2, 0.2, 0.2, false); } - if (source.getDirectEntity() instanceof ThrownPotion || source.getDirectEntity() instanceof AreaEffectCloud) - return false; - if (source.is(DamageTypes.FALL)) - return false; - if (source.is(DamageTypes.CACTUS)) - return false; - if (source.is(DamageTypes.DROWN)) - return false; - if (source.is(DamageTypes.LIGHTNING_BOLT)) - return false; - if (source.is(DamageTypes.FALLING_ANVIL)) - return false; - if (source.is(DamageTypes.DRAGON_BREATH)) - return false; - if (source.is(DamageTypes.WITHER)) - return false; - if (source.is(DamageTypes.WITHER_SKULL)) - return false; if (source.is(ModDamageTypes.PROJECTILE_BOOM)) { amount *= 0.5f; } if (source.is(ModDamageTypes.CANNON_FIRE)) { amount *= 1.4f; } + if (source.is(ModDamageTypes.GUN_FIRE)) { + amount *= 0.1f; + } if (source.is(ModDamageTypes.GUN_FIRE_ABSOLUTE)) { - amount *= 1.6f; + amount *= 0.5f; } this.level().playSound(null, this.getOnPos(), ModSounds.HIT.get(), SoundSource.PLAYERS, 1, 1); - this.entityData.set(HEALTH, this.entityData.get(HEALTH) - 0.5f * Math.max(amount - 5, 0)); - + this.hurt(0.5f * Math.max(amount - 5, 0)); return true; } - @Override - public boolean isPickable() { - return !this.isRemoved(); - } - @Override public InteractionResult interact(Player player, InteractionHand hand) { if (player.isShiftKeyDown()) { @@ -221,27 +180,27 @@ public class Mle1934Entity extends Entity implements GeoEntity, ICannonEntity { this.setDeltaMovement(this.getDeltaMovement().add(0.0, -0.04, 0.0)); } - if (this.entityData.get(HEALTH) <= 0.4 * CannonConfig.MLE1934_HP.get()) { + if (this.getHealth() <= 0.4 * this.getMaxHealth()) { if (this.level() instanceof ServerLevel serverLevel) { ParticleTool.sendParticle(serverLevel, ParticleTypes.LARGE_SMOKE, this.getX(), this.getY() + 2.5, this.getZ(), 2, 0.75, 0.5, 0.75, 0.01, false); } } - if (this.entityData.get(HEALTH) <= 0.25 * CannonConfig.MLE1934_HP.get()) { + if (this.getHealth() <= 0.25 * this.getMaxHealth()) { if (this.level() instanceof ServerLevel serverLevel) { ParticleTool.sendParticle(serverLevel, ParticleTypes.LARGE_SMOKE, this.getX(), this.getY() + 2.5, this.getZ(), 1, 0.75, 0.5, 0.75, 0.01, false); ParticleTool.sendParticle(serverLevel, ParticleTypes.CAMPFIRE_COSY_SMOKE, this.getX(), this.getY() + 2.5, this.getZ(), 1, 0.75, 0.5, 0.75, 0.01, false); } } - if (this.entityData.get(HEALTH) <= 0.15 * CannonConfig.MLE1934_HP.get()) { + if (this.getHealth() <= 0.15 * this.getMaxHealth()) { if (this.level() instanceof ServerLevel serverLevel) { ParticleTool.sendParticle(serverLevel, ParticleTypes.LARGE_SMOKE, this.getX(), this.getY() + 2.5, this.getZ(), 1, 0.75, 0.5, 0.75, 0.01, false); ParticleTool.sendParticle(serverLevel, ParticleTypes.CAMPFIRE_COSY_SMOKE, this.getX(), this.getY() + 2.5, this.getZ(), 1, 0.75, 0.5, 0.75, 0.01, false); } } - if (this.entityData.get(HEALTH) <= 0.1 * CannonConfig.MLE1934_HP.get()) { + if (this.getHealth() <= 0.1 * this.getMaxHealth()) { if (this.level() instanceof ServerLevel serverLevel) { ParticleTool.sendParticle(serverLevel, ParticleTypes.LARGE_SMOKE, this.getX(), this.getY() + 2.5, this.getZ(), 2, 0.75, 0.5, 0.75, 0.01, false); ParticleTool.sendParticle(serverLevel, ParticleTypes.CAMPFIRE_COSY_SMOKE, this.getX(), this.getY() + 2.5, this.getZ(), 2, 0.75, 0.5, 0.75, 0.01, false); @@ -251,30 +210,27 @@ public class Mle1934Entity extends Entity implements GeoEntity, ICannonEntity { if (this.tickCount % 15 == 0) { this.level().playSound(null, this.getOnPos(), SoundEvents.FIRE_AMBIENT, SoundSource.PLAYERS, 1, 1); } - this.entityData.set(HEALTH, this.entityData.get(HEALTH) - 0.1f); + this.hurt(0.1f); } else { - this.entityData.set(HEALTH, Math.min(this.entityData.get(HEALTH) + 0.05f, MAX_HEALTH)); + this.heal(0.05f); } - if (this.entityData.get(HEALTH) <= 0) { - this.ejectPassengers(); - destroy(); - } - - travel(); this.refreshDimensions(); } - private void destroy() { - CustomExplosion explosion = new CustomExplosion(this.level(), this, - ModDamageTypes.causeProjectileBoomDamage(this.level().registryAccess(), this, this), 140f, - this.getX(), this.getY(), this.getZ(), 10f, ExplosionDestroyConfig.EXPLOSION_DESTROY.get() ? Explosion.BlockInteraction.DESTROY : Explosion.BlockInteraction.KEEP).setDamageMultiplier(1); - explosion.explode(); - net.minecraftforge.event.ForgeEventFactory.onExplosionStart(this.level(), explosion); - explosion.finalizeExplosion(false); - ParticleTool.spawnHugeExplosionParticles(this.level(), this.position()); - - this.discard(); + @Override + public void destroy() { + if (level() instanceof ServerLevel) { + Entity attacker = EntityFindUtil.findEntity(this.level(), this.entityData.get(LAST_ATTACKER_UUID)); + CustomExplosion explosion = new CustomExplosion(this.level(), attacker == null ? this : attacker, + ModDamageTypes.causeCustomExplosionDamage(this.level().registryAccess(), attacker == null ? this : attacker, attacker == null ? this : attacker), 150.0f, + this.getX(), this.getY(), this.getZ(), 5f, ExplosionDestroyConfig.EXPLOSION_DESTROY.get() ? Explosion.BlockInteraction.DESTROY : Explosion.BlockInteraction.KEEP).setDamageMultiplier(1); + explosion.explode(); + net.minecraftforge.event.ForgeEventFactory.onExplosionStart(this.level(), explosion); + explosion.finalizeExplosion(false); + ParticleTool.spawnMediumExplosionParticles(this.level(), this.position()); + this.discard(); + } } @Override @@ -451,12 +407,6 @@ public class Mle1934Entity extends Entity implements GeoEntity, ICannonEntity { } @Override - public void lerpTo(double x, double y, double z, float yaw, float pitch, int interpolationSteps, boolean interpolate) { - serverYRot = yaw; - serverXRot = pitch; - this.interpolationSteps = 10; - } - public void travel() { Entity passenger = this.getPassengers().isEmpty() ? null : this.getPassengers().get(0); if (!(passenger instanceof LivingEntity entity)) return; @@ -503,16 +453,11 @@ public class Mle1934Entity extends Entity implements GeoEntity, ICannonEntity { return this.cache; } - @Override - public float getHealth() { - return this.entityData.get(HEALTH).intValue(); - } - @Override public float getMaxHealth() { - return (int) MAX_HEALTH; + return MAX_HEALTH; } - + @Override public boolean isDriver(Player player) { return player == this.getFirstPassenger(); diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/MobileVehicleEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/MobileVehicleEntity.java index 503948f09..bdd602364 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/MobileVehicleEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/MobileVehicleEntity.java @@ -4,7 +4,6 @@ import com.atsuishio.superbwarfare.entity.projectile.ProjectileEntity; import com.atsuishio.superbwarfare.init.ModDamageTypes; import com.atsuishio.superbwarfare.init.ModSounds; import net.minecraft.nbt.CompoundTag; -import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.item.ItemEntity; @@ -14,18 +13,7 @@ import net.minecraft.world.level.entity.EntityTypeTest; import net.minecraft.world.phys.Vec3; import org.joml.Math; -public class MobileVehicleEntity extends Entity { - - protected int interpolationSteps; - - protected double x; - protected double y; - protected double z; - - protected double serverYRot; - protected double serverXRot; - - public float roll; +public class MobileVehicleEntity extends EnergyVehicleEntity { public float power; public boolean leftInputDown; public boolean rightInputDown; @@ -33,68 +21,19 @@ public class MobileVehicleEntity extends Entity { public boolean backInputDown; public boolean upInputDown; public boolean downInputDown; + public float roll; public MobileVehicleEntity(EntityType pEntityType, Level pLevel) { super(pEntityType, pLevel); } - @Override - public boolean canBeCollidedWith() { - return true; - } - - @Override - public boolean isPushable() { - return false; - } - - @Override - public boolean isPickable() { - return !this.isRemoved(); - } - @Override public void baseTick() { super.baseTick(); - - float delta = Math.abs(getYRot() - yRotO); - while (getYRot() > 180F) { - setYRot(getYRot() - 360F); - yRotO = getYRot() - delta; - } - while (getYRot() <= -180F) { - setYRot(getYRot() + 360F); - yRotO = delta + getYRot(); - } - - handleClientSync(); - crushEntities(this.getDeltaMovement()); - this.refreshDimensions(); } - protected void handleClientSync() { - if (isControlledByLocalInstance()) { - interpolationSteps = 0; - syncPacketPositionCodec(getX(), getY(), getZ()); - } - if (interpolationSteps <= 0) { - return; - } - double interpolatedX = getX() + (x - getX()) / (double) interpolationSteps; - double interpolatedY = getY() + (y - getY()) / (double) interpolationSteps; - double interpolatedZ = getZ() + (z - getZ()) / (double) interpolationSteps; - double interpolatedYaw = Mth.wrapDegrees(serverYRot - (double) getYRot()); - setYRot(getYRot() + (float) interpolatedYaw / (float) interpolationSteps); - setXRot(getXRot() + (float) (serverXRot - (double) getXRot()) / (float) interpolationSteps); - - setPos(interpolatedX, interpolatedY, interpolatedZ); - setRot(getYRot(), getXRot()); - - --interpolationSteps; - } - /** * 撞击实体并造成伤害 * @param velocity 动量 @@ -122,38 +61,18 @@ public class MobileVehicleEntity extends Entity { } } - @Override - public void lerpTo(double x, double y, double z, float yaw, float pitch, int interpolationSteps, boolean interpolate) { - this.x = x; - this.y = y; - this.z = z; - serverYRot = yaw; - serverXRot = pitch; - this.interpolationSteps = 10; - } - - public static double calculateAngle(Vec3 move, Vec3 view) { - move = move.multiply(1, 0, 1).normalize(); - view = view.multiply(1, 0, 1).normalize(); - - double startLength = move.length(); - double endLength = view.length(); - if (startLength > 0.0D && endLength > 0.0D) { - return Math.toDegrees(Math.acos(Mth.clamp(move.dot(view) / (startLength * endLength), -1, 1))); - } else { - return 0.0D; - } - } - @Override protected void defineSynchedData() { + super.defineSynchedData(); } @Override - protected void readAdditionalSaveData(CompoundTag compoundTag) { + protected void readAdditionalSaveData(CompoundTag compound) { + super.readAdditionalSaveData(compound); } @Override public void addAdditionalSaveData(CompoundTag compound) { + super.addAdditionalSaveData(compound); } } diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/SpeedboatEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/SpeedboatEntity.java index ab9ffe903..3bdbbfb23 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/SpeedboatEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/SpeedboatEntity.java @@ -38,14 +38,15 @@ import net.minecraft.world.Containers; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.damagesource.DamageSource; -import net.minecraft.world.damagesource.DamageTypes; import net.minecraft.world.effect.MobEffect; import net.minecraft.world.effect.MobEffectInstance; -import net.minecraft.world.entity.*; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.HasCustomInventoryScreen; +import net.minecraft.world.entity.MoverType; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.entity.projectile.ThrownPotion; import net.minecraft.world.entity.vehicle.ContainerEntity; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.ItemStack; @@ -87,15 +88,12 @@ import static com.atsuishio.superbwarfare.tools.ParticleTool.sendParticle; public class SpeedboatEntity extends MobileVehicleEntity implements GeoEntity, IChargeEntity, IVehicleEntity, HasCustomInventoryScreen, ContainerEntity { public static final EntityDataAccessor POWER = SynchedEntityData.defineId(SpeedboatEntity.class, EntityDataSerializers.FLOAT); public static final EntityDataAccessor FIRE_ANIM = SynchedEntityData.defineId(SpeedboatEntity.class, EntityDataSerializers.INT); - public static final EntityDataAccessor HEALTH = SynchedEntityData.defineId(SpeedboatEntity.class, EntityDataSerializers.FLOAT); - public static final EntityDataAccessor ENERGY = SynchedEntityData.defineId(SpeedboatEntity.class, EntityDataSerializers.FLOAT); public static final EntityDataAccessor DELTA_ROT = SynchedEntityData.defineId(SpeedboatEntity.class, EntityDataSerializers.FLOAT); public static final EntityDataAccessor HEAT = SynchedEntityData.defineId(SpeedboatEntity.class, EntityDataSerializers.INT); - protected static final EntityDataAccessor LAST_ATTACKER_UUID = SynchedEntityData.defineId(SpeedboatEntity.class, EntityDataSerializers.STRING); public static final EntityDataAccessor AMMO = SynchedEntityData.defineId(SpeedboatEntity.class, EntityDataSerializers.INT); public static final float MAX_HEALTH = CannonConfig.SPEEDBOAT_HP.get(); - public static final float MAX_ENERGY = CannonConfig.SPEEDBOAT_MAX_ENERGY.get().floatValue(); + public static final int MAX_ENERGY = CannonConfig.SPEEDBOAT_MAX_ENERGY.get(); public static final int CONTAINER_SIZE = 105; private NonNullList items = NonNullList.withSize(CONTAINER_SIZE, ItemStack.EMPTY); @@ -123,35 +121,24 @@ public class SpeedboatEntity extends MobileVehicleEntity implements GeoEntity, I @Override protected void defineSynchedData() { + super.defineSynchedData(); this.entityData.define(POWER, 0f); this.entityData.define(AMMO, 0); this.entityData.define(FIRE_ANIM, 0); - this.entityData.define(HEALTH, MAX_HEALTH); - this.entityData.define(ENERGY, 0f); this.entityData.define(DELTA_ROT, 0f); this.entityData.define(HEAT, 0); - this.entityData.define(LAST_ATTACKER_UUID, "undefined"); } @Override public void addAdditionalSaveData(CompoundTag compound) { - compound.putFloat("Health", this.entityData.get(HEALTH)); + super.addAdditionalSaveData(compound); compound.putFloat("Energy", this.entityData.get(ENERGY)); - compound.putString("LastAttacker", this.entityData.get(LAST_ATTACKER_UUID)); ContainerHelper.saveAllItems(compound, this.getItemStacks()); } @Override public void readAdditionalSaveData(CompoundTag compound) { - this.entityData.set(ENERGY, compound.getFloat("Energy")); - if (compound.contains("Health")) { - this.entityData.set(HEALTH, compound.getFloat("Health")); - } else { - this.entityData.set(HEALTH, MAX_HEALTH); - } - if (compound.contains("LastAttacker")) { - this.entityData.set(LAST_ATTACKER_UUID, compound.getString("LastAttacker")); - } + super.readAdditionalSaveData(compound); ContainerHelper.loadAllItems(compound, this.getItemStacks()); } @@ -175,44 +162,24 @@ public class SpeedboatEntity extends MobileVehicleEntity implements GeoEntity, I @Override public boolean hurt(DamageSource source, float amount) { + super.hurt(source, amount); if (this.level() instanceof ServerLevel serverLevel) { sendParticle(serverLevel, ModParticleTypes.FIRE_STAR.get(), this.getX(), this.getY() + 2.5, this.getZ(), 4, 0.2, 0.2, 0.2, 0.2, false); } - - if (source.getDirectEntity() instanceof ThrownPotion || source.getDirectEntity() instanceof AreaEffectCloud) - return false; - if (source.is(DamageTypes.FALL)) - return false; - if (source.is(DamageTypes.CACTUS)) - return false; - if (source.is(DamageTypes.DROWN)) - return false; - if (source.is(DamageTypes.LIGHTNING_BOLT)) - return false; - if (source.is(DamageTypes.FALLING_ANVIL)) - return false; - if (source.is(DamageTypes.DRAGON_BREATH)) - return false; - if (source.is(DamageTypes.WITHER)) - return false; - if (source.is(DamageTypes.WITHER_SKULL)) - return false; if (source.is(ModDamageTypes.PROJECTILE_BOOM)) { amount *= 2f; } if (source.is(ModDamageTypes.CANNON_FIRE)) { amount *= 3f; } + if (source.is(ModDamageTypes.GUN_FIRE)) { + amount *= 0.3f; + } if (source.is(ModDamageTypes.GUN_FIRE_ABSOLUTE)) { - amount *= 1.2f; + amount *= 0.7f; } - - if (source.getEntity() != null) { - this.entityData.set(LAST_ATTACKER_UUID, source.getEntity().getStringUUID()); - } - this.level().playSound(null, this.getOnPos(), ModSounds.HIT.get(), SoundSource.PLAYERS, 1, 1); - this.entityData.set(HEALTH, this.entityData.get(HEALTH) - 0.5f * Math.max(amount - 3, 0)); + this.hurt(0.5f * Math.max(amount - 3, 0)); return true; } @@ -235,8 +202,8 @@ public class SpeedboatEntity extends MobileVehicleEntity implements GeoEntity, I } } else { if (player.getMainHandItem().is(Items.IRON_INGOT)) { - if (this.entityData.get(HEALTH) < MAX_HEALTH) { - this.entityData.set(HEALTH, Math.min(this.entityData.get(HEALTH) + 0.1f * MAX_HEALTH, MAX_HEALTH)); + if (this.getHealth() < this.getMaxHealth()) { + this.heal(Math.min(0.1f * this.getMaxHealth(), this.getMaxHealth())); player.getMainHandItem().shrink(1); if (!this.level().isClientSide) { this.level().playSound(null, this, SoundEvents.IRON_GOLEM_REPAIR, this.getSoundSource(), 1, 1); @@ -308,12 +275,7 @@ public class SpeedboatEntity extends MobileVehicleEntity implements GeoEntity, I this.setDeltaMovement(this.getDeltaMovement().multiply(f, 0.85, f)); } - this.entityData.set(HEALTH, java.lang.Math.min(this.entityData.get(HEALTH) + 0.05f, MAX_HEALTH)); - - if (this.entityData.get(HEALTH) <= 0) { - this.ejectPassengers(); - destroy(); - } + this.heal(0.05f); if (this.level() instanceof ServerLevel serverLevel && this.isInWater() && this.getDeltaMovement().length() > 0.1) { sendParticle(serverLevel, ParticleTypes.CLOUD, this.getX() + 0.5 * this.getDeltaMovement().x, this.getY() + getSubmergedHeight(this) - 0.2, this.getZ() + 0.5 * this.getDeltaMovement().z, (int)(2 + 4 * this.getDeltaMovement().length()), 0.65, 0, 0.65, 0, true); @@ -321,7 +283,6 @@ public class SpeedboatEntity extends MobileVehicleEntity implements GeoEntity, I sendParticle(serverLevel, ParticleTypes.BUBBLE_COLUMN_UP, this.getX() - 4.5 * this.getLookAngle().x, this.getY() - 0.25, this.getZ() - 4.5 * this.getLookAngle().z, (int)(40 * Mth.abs(power)), 0.15, 0.15, 0.15, 0.02, true); } - controlBoat(); collideBlock(); gunnerAngle(); pickUpItem(); @@ -433,10 +394,11 @@ public class SpeedboatEntity extends MobileVehicleEntity implements GeoEntity, I }); } - private void controlBoat() { + @Override + public void travel() { Entity passenger0 = this.getPassengers().isEmpty() ? null : this.getPassengers().get(0); - if (this.entityData.get(ENERGY) <= 0) return; + if (this.getEnergy() <= 0) return; if (passenger0 == null) { this.leftInputDown = false; @@ -465,7 +427,7 @@ public class SpeedboatEntity extends MobileVehicleEntity implements GeoEntity, I } if (this.forwardInputDown || this.backInputDown) { - this.entityData.set(ENERGY, Math.max(this.entityData.get(ENERGY) - CannonConfig.SPEEDBOAT_ENERGY_COST.get().floatValue(), 0)); + this.extraEnergy(CannonConfig.SPEEDBOAT_ENERGY_COST.get()); } if (level().isClientSide) { @@ -571,11 +533,12 @@ public class SpeedboatEntity extends MobileVehicleEntity implements GeoEntity, I } } } - private void destroy() { + @Override + public void destroy() { Entity attacker = EntityFindUtil.findEntity(this.level(), this.entityData.get(LAST_ATTACKER_UUID)); - CustomExplosion explosion = new CustomExplosion(this.level(), attacker, - ModDamageTypes.causeProjectileBoomDamage(this.level().registryAccess(), attacker, attacker), 45f, - this.getX(), this.getY(), this.getZ(), 3f, ExplosionDestroyConfig.EXPLOSION_DESTROY.get() ? Explosion.BlockInteraction.DESTROY : Explosion.BlockInteraction.KEEP).setDamageMultiplier(1); + CustomExplosion explosion = new CustomExplosion(this.level(), attacker == null ? this : attacker, + ModDamageTypes.causeProjectileBoomDamage(this.level().registryAccess(), attacker == null ? this : attacker, attacker == null ? this : attacker), 75f, + this.getX(), this.getY(), this.getZ(), 5f, ExplosionDestroyConfig.EXPLOSION_DESTROY.get() ? Explosion.BlockInteraction.DESTROY : Explosion.BlockInteraction.KEEP).setDamageMultiplier(1); explosion.explode(); net.minecraftforge.event.ForgeEventFactory.onExplosionStart(this.level(), explosion); explosion.finalizeExplosion(false); @@ -620,16 +583,6 @@ public class SpeedboatEntity extends MobileVehicleEntity implements GeoEntity, I return this.cache; } - @Override - public void charge(int amount) { - this.entityData.set(ENERGY, Math.min(this.entityData.get(ENERGY) + amount, MAX_ENERGY)); - } - - @Override - public boolean canCharge() { - return this.entityData.get(ENERGY) < MAX_ENERGY; - } - @Override protected boolean canAddPassenger(Entity pPassenger) { return this.getPassengers().size() < this.getMaxPassengers(); @@ -772,24 +725,14 @@ public class SpeedboatEntity extends MobileVehicleEntity implements GeoEntity, I this.level().gameEvent(GameEvent.CONTAINER_CLOSE, this.position(), GameEvent.Context.of(pPlayer)); } - @Override - public int getEnergy() { - return this.entityData.get(ENERGY).intValue(); - } - @Override public int getMaxEnergy() { - return (int) MAX_ENERGY; - } - - @Override - public float getHealth() { - return this.entityData.get(HEALTH).intValue(); + return MAX_ENERGY; } @Override public float getMaxHealth() { - return (int) MAX_HEALTH; + return MAX_HEALTH; } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/VehicleEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/VehicleEntity.java new file mode 100644 index 000000000..262914716 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/entity/VehicleEntity.java @@ -0,0 +1,188 @@ +package com.atsuishio.superbwarfare.entity; + +import net.minecraft.nbt.CompoundTag; +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.damagesource.DamageSource; +import net.minecraft.world.damagesource.DamageTypes; +import net.minecraft.world.entity.AreaEffectCloud; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.projectile.ThrownPotion; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; +import org.joml.Math; + + +public class VehicleEntity extends Entity { + public static final EntityDataAccessor HEALTH = SynchedEntityData.defineId(VehicleEntity.class, EntityDataSerializers.FLOAT); + protected static final EntityDataAccessor LAST_ATTACKER_UUID = SynchedEntityData.defineId(VehicleEntity.class, EntityDataSerializers.STRING); + protected int interpolationSteps; + protected double x; + protected double y; + protected double z; + protected double serverYRot; + protected double serverXRot; + + public VehicleEntity(EntityType pEntityType, Level pLevel) { + super(pEntityType, pLevel); + this.setHealth(this.getMaxHealth()); + } + + @Override + protected void defineSynchedData() { + this.entityData.define(HEALTH, this.getMaxHealth()); + this.entityData.define(LAST_ATTACKER_UUID, "undefined"); + } + + @Override + protected void readAdditionalSaveData(CompoundTag compound) { + this.entityData.set(LAST_ATTACKER_UUID, compound.getString("LastAttacker")); + this.entityData.set(HEALTH, compound.getFloat("Health")); + + } + + @Override + public void addAdditionalSaveData(CompoundTag compound) { + compound.putFloat("Health", this.entityData.get(HEALTH)); + compound.putString("LastAttacker", this.entityData.get(LAST_ATTACKER_UUID)); + } + + @Override + public boolean hurt(DamageSource source, float amount) { + if (source.getDirectEntity() instanceof ThrownPotion || source.getDirectEntity() instanceof AreaEffectCloud) + return false; + if (source.is(DamageTypes.FALL)) + return false; + if (source.is(DamageTypes.CACTUS)) + return false; + if (source.is(DamageTypes.DROWN)) + return false; + if (source.is(DamageTypes.LIGHTNING_BOLT)) + return false; + if (source.is(DamageTypes.FALLING_ANVIL)) + return false; + if (source.is(DamageTypes.DRAGON_BREATH)) + return false; + if (source.is(DamageTypes.WITHER)) + return false; + if (source.is(DamageTypes.WITHER_SKULL)) + return false; + if (source.getEntity() != null) { + this.entityData.set(LAST_ATTACKER_UUID, source.getEntity().getStringUUID()); + } + return true; + } + + public void heal(float pHealAmount) { + this.setHealth(this.getHealth() + pHealAmount); + } + + public void hurt(float pHealAmount) { + this.setHealth(this.getHealth() - pHealAmount); + } + + public float getHealth() { + return this.entityData.get(HEALTH); + } + + public void setHealth(float pHealth) { + this.entityData.set(HEALTH, Mth.clamp(pHealth, 0.0F, this.getMaxHealth())); + } + + public float getMaxHealth() { + return 50; + } + + @Override + public boolean canBeCollidedWith() { + return true; + } + + @Override + public boolean isPushable() { + return false; + } + + @Override + public boolean isPickable() { + return !this.isRemoved(); + } + + @Override + public void baseTick() { + super.baseTick(); + + float delta = Math.abs(getYRot() - yRotO); + while (getYRot() > 180F) { + setYRot(getYRot() - 360F); + yRotO = getYRot() - delta; + } + while (getYRot() <= -180F) { + setYRot(getYRot() + 360F); + yRotO = delta + getYRot(); + } + + handleClientSync(); + + if (this.getHealth() <= 0) { + this.ejectPassengers(); + destroy(); + } + + travel(); + this.refreshDimensions(); + } + + public void destroy() { + } + + public void travel() { + } + + protected void handleClientSync() { + if (isControlledByLocalInstance()) { + interpolationSteps = 0; + syncPacketPositionCodec(getX(), getY(), getZ()); + } + if (interpolationSteps <= 0) { + return; + } + double interpolatedX = getX() + (x - getX()) / (double) interpolationSteps; + double interpolatedY = getY() + (y - getY()) / (double) interpolationSteps; + double interpolatedZ = getZ() + (z - getZ()) / (double) interpolationSteps; + double interpolatedYaw = Mth.wrapDegrees(serverYRot - (double) getYRot()); + setYRot(getYRot() + (float) interpolatedYaw / (float) interpolationSteps); + setXRot(getXRot() + (float) (serverXRot - (double) getXRot()) / (float) interpolationSteps); + + setPos(interpolatedX, interpolatedY, interpolatedZ); + setRot(getYRot(), getXRot()); + + --interpolationSteps; + } + + @Override + public void lerpTo(double x, double y, double z, float yaw, float pitch, int interpolationSteps, boolean interpolate) { + this.x = x; + this.y = y; + this.z = z; + serverYRot = yaw; + serverXRot = pitch; + this.interpolationSteps = 10; + } + + public static double calculateAngle(Vec3 move, Vec3 view) { + move = move.multiply(1, 0, 1).normalize(); + view = view.multiply(1, 0, 1).normalize(); + + double startLength = move.length(); + double endLength = view.length(); + if (startLength > 0.0D && endLength > 0.0D) { + return Math.toDegrees(Math.acos(Mth.clamp(move.dot(view) / (startLength * endLength), -1, 1))); + } else { + return 0.0D; + } + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/WheelChairEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/WheelChairEntity.java index 26a80d4e1..118053001 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/WheelChairEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/WheelChairEntity.java @@ -1,15 +1,17 @@ package com.atsuishio.superbwarfare.entity; +import com.atsuishio.superbwarfare.config.server.ExplosionDestroyConfig; +import com.atsuishio.superbwarfare.init.ModDamageTypes; import com.atsuishio.superbwarfare.init.ModEntities; import com.atsuishio.superbwarfare.init.ModItems; import com.atsuishio.superbwarfare.init.ModSounds; import com.atsuishio.superbwarfare.item.ContainerBlockItem; +import com.atsuishio.superbwarfare.tools.CustomExplosion; +import com.atsuishio.superbwarfare.tools.EntityFindUtil; +import com.atsuishio.superbwarfare.tools.ParticleTool; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.ClientGamePacketListener; -import net.minecraft.network.syncher.EntityDataAccessor; -import net.minecraft.network.syncher.EntityDataSerializers; -import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundEvents; @@ -18,12 +20,11 @@ import net.minecraft.util.Mth; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.damagesource.DamageSource; -import net.minecraft.world.damagesource.DamageTypes; import net.minecraft.world.entity.*; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.entity.projectile.ThrownPotion; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; +import net.minecraft.world.level.Explosion; import net.minecraft.world.level.Level; import net.minecraftforge.network.NetworkHooks; import net.minecraftforge.network.PlayMessages; @@ -33,13 +34,10 @@ import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache import software.bernie.geckolib.core.animation.AnimatableManager; import software.bernie.geckolib.util.GeckoLibUtil; -public class WheelChairEntity extends MobileVehicleEntity implements GeoEntity, IVehicleEntity, IChargeEntity { - - public static final EntityDataAccessor HEALTH = SynchedEntityData.defineId(WheelChairEntity.class, EntityDataSerializers.FLOAT); - public static final EntityDataAccessor ENERGY = SynchedEntityData.defineId(WheelChairEntity.class, EntityDataSerializers.FLOAT); +public class WheelChairEntity extends MobileVehicleEntity implements GeoEntity, IVehicleEntity { private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); public static final float MAX_HEALTH = 50; - public static final float MAX_ENERGY = 24000; + public static final int MAX_ENERGY = 24000; public float leftWheelRot; public float rightWheelRot; public float leftWheelRotO; @@ -56,23 +54,17 @@ public class WheelChairEntity extends MobileVehicleEntity implements GeoEntity, @Override protected void defineSynchedData() { - this.entityData.define(HEALTH, MAX_HEALTH); - this.entityData.define(ENERGY, 0f); + super.defineSynchedData(); } @Override public void addAdditionalSaveData(CompoundTag compound) { - if (compound.contains("Health")) { - this.entityData.set(HEALTH, compound.getFloat("Health")); - } else { - this.entityData.set(HEALTH, MAX_HEALTH); - } - compound.putFloat("Energy", this.entityData.get(ENERGY)); + super.addAdditionalSaveData(compound); } @Override public void readAdditionalSaveData(CompoundTag compound) { - this.entityData.set(ENERGY, compound.getFloat("Energy")); + super.readAdditionalSaveData(compound); } @Override @@ -92,27 +84,9 @@ public class WheelChairEntity extends MobileVehicleEntity implements GeoEntity, @Override public boolean hurt(DamageSource source, float amount) { - if (source.getDirectEntity() instanceof ThrownPotion || source.getDirectEntity() instanceof AreaEffectCloud) - return false; - if (source.is(DamageTypes.FALL)) - return false; - if (source.is(DamageTypes.CACTUS)) - return false; - if (source.is(DamageTypes.DROWN)) - return false; - if (source.is(DamageTypes.LIGHTNING_BOLT)) - return false; - if (source.is(DamageTypes.FALLING_ANVIL)) - return false; - if (source.is(DamageTypes.DRAGON_BREATH)) - return false; - if (source.is(DamageTypes.WITHER)) - return false; - if (source.is(DamageTypes.WITHER_SKULL)) - return false; - + super.hurt(source, amount); this.level().playSound(null, this.getOnPos(), ModSounds.HIT.get(), SoundSource.PLAYERS, 1, 1); - this.entityData.set(HEALTH, this.entityData.get(HEALTH) - amount); + this.hurt(amount); return true; } @@ -128,8 +102,8 @@ public class WheelChairEntity extends MobileVehicleEntity implements GeoEntity, this.discard(); } else { if (player.getMainHandItem().is(Items.IRON_INGOT)) { - if (this.entityData.get(HEALTH) < MAX_HEALTH) { - this.entityData.set(HEALTH, Math.min(this.entityData.get(HEALTH) + 0.5f * MAX_HEALTH, MAX_HEALTH)); + if (this.getHealth() < this.getMaxHealth()) { + this.heal(Math.min(0.5f * this.getMaxHealth(), this.getMaxHealth())); player.getMainHandItem().shrink(1); if (!this.level().isClientSide) { this.level().playSound(null, this, SoundEvents.IRON_GOLEM_REPAIR, this.getSoundSource(), 1, 1); @@ -161,12 +135,12 @@ public class WheelChairEntity extends MobileVehicleEntity implements GeoEntity, this.move(MoverType.SELF, this.getDeltaMovement()); - if (this.entityData.get(HEALTH) <= 0) { + if (this.getHealth() <= 0) { this.ejectPassengers(); destroy(); } - if (level().isClientSide && this.entityData.get(ENERGY) > 0) { + if (level().isClientSide && this.getEnergy() > 0) { level().playLocalSound(this.getX(), this.getY() + this.getBbHeight() * 0.5, this.getZ(), ModSounds.WHEEL_CHAIR_ENGINE.get(), this.getSoundSource(), (float) (0.2 * this.getDeltaMovement().length()), (random.nextFloat() * 0.1f + 0.7f), false); } @@ -176,38 +150,46 @@ public class WheelChairEntity extends MobileVehicleEntity implements GeoEntity, this.refreshDimensions(); } + @Override public void travel() { Entity passenger = this.getPassengers().isEmpty() ? null : this.getPassengers().get(0); - if (!(passenger instanceof LivingEntity entity)) return; - float diffY = Math.clamp(-90f, 90f, Mth.wrapDegrees(entity.getYHeadRot() - this.getYRot())); + float diffY = 0; - this.setYRot(this.getYRot() + Mth.clamp(0.4f * diffY,-5f, 5f)); + if (passenger == null) { + this.leftInputDown = false; + this.rightInputDown = false; + this.forwardInputDown = false; + this.backInputDown = false; + } else { + diffY = Math.clamp(-90f, 90f, Mth.wrapDegrees(passenger.getYHeadRot() - this.getYRot())); + this.setYRot(this.getYRot() + Mth.clamp(0.4f * diffY, -5f, 5f)); + } if (this.forwardInputDown) { power += 0.01f; - if (this.entityData.get(ENERGY) <= 0 && entity instanceof Player player) { + if (this.getEnergy() <= 0 && passenger instanceof Player player) { moveWithOutPower(player, true); } } if (this.backInputDown) { power -= 0.01f; - if (this.entityData.get(ENERGY) <= 0 && entity instanceof Player player) { + if (this.getEnergy() <= 0 && passenger instanceof Player player) { moveWithOutPower(player, false); } } - if (this.upInputDown && this.onGround() && this.entityData.get(ENERGY) > 800) { - if (entity instanceof ServerPlayer serverPlayer) { + if (this.upInputDown && this.onGround() && this.getEnergy() > 400) { + if (passenger instanceof ServerPlayer serverPlayer) { serverPlayer.level().playSound(null, serverPlayer.getOnPos(), ModSounds.WHEEL_CHAIR_JUMP.get(), SoundSource.PLAYERS, 1, 1); } - this.entityData.set(ENERGY, this.entityData.get(ENERGY) - 800); + this.extraEnergy(400); this.setDeltaMovement(this.getDeltaMovement().add(0, 0.58, 0)); } if (this.forwardInputDown || this.backInputDown) { - this.entityData.set(ENERGY, Math.max(this.entityData.get(ENERGY) - 1, 0)); + this.extraEnergy(1); } power *= 0.87f; @@ -221,8 +203,8 @@ public class WheelChairEntity extends MobileVehicleEntity implements GeoEntity, s0 = -this.getDeltaMovement().length(); } - this.setLeftWheelRot((float) (this.getLeftWheelRot() - 0.85 * s0) - 0.015f * Mth.clamp(0.4f * diffY,-5f, 5f)); - this.setRightWheelRot((float) (this.getRightWheelRot() - 0.85 * s0) + 0.015f * Mth.clamp(0.4f * diffY,-5f, 5f)); + this.setLeftWheelRot((float) (this.getLeftWheelRot() - 1 * s0) - 0.015f * Mth.clamp(0.4f * diffY, -5f, 5f)); + this.setRightWheelRot((float) (this.getRightWheelRot() - 1 * s0) + 0.015f * Mth.clamp(0.4f * diffY, -5f, 5f)); // if (entity instanceof Player player) { // player.displayClientMessage(Component.literal("Angle:" + new java.text.DecimalFormat("##.##").format(this.getRightWheelRot())), true); @@ -274,11 +256,19 @@ public class WheelChairEntity extends MobileVehicleEntity implements GeoEntity, this.clampRotation(entity); } - private void destroy() { + @Override + public void destroy() { if (level() instanceof ServerLevel) { - level().explode(null, this.getX(), this.getY(), this.getZ(), 0, Level.ExplosionInteraction.NONE); + Entity attacker = EntityFindUtil.findEntity(this.level(), this.entityData.get(LAST_ATTACKER_UUID)); + CustomExplosion explosion = new CustomExplosion(this.level(), attacker == null ? this : attacker, + ModDamageTypes.causeCustomExplosionDamage(this.level().registryAccess(), attacker == null ? this : attacker, attacker == null ? this : attacker), 25.0f, + this.getX(), this.getY(), this.getZ(), 5f, ExplosionDestroyConfig.EXPLOSION_DESTROY.get() ? Explosion.BlockInteraction.DESTROY : Explosion.BlockInteraction.KEEP).setDamageMultiplier(1); + explosion.explode(); + net.minecraftforge.event.ForgeEventFactory.onExplosionStart(this.level(), explosion); + explosion.finalizeExplosion(false); + ParticleTool.spawnMediumExplosionParticles(this.level(), this.position()); + this.discard(); } - this.discard(); } @Override @@ -294,14 +284,9 @@ public class WheelChairEntity extends MobileVehicleEntity implements GeoEntity, return this.cache; } - @Override - public float getHealth() { - return this.entityData.get(HEALTH).intValue(); - } - @Override public float getMaxHealth() { - return (int) MAX_HEALTH; + return MAX_HEALTH; } @Override @@ -324,23 +309,8 @@ public class WheelChairEntity extends MobileVehicleEntity implements GeoEntity, return -1; } - @Override - public int getEnergy() { - return this.entityData.get(ENERGY).intValue(); - } - @Override public int getMaxEnergy() { - return (int) MAX_ENERGY; - } - - @Override - public void charge(int amount) { - this.entityData.set(ENERGY, Math.min(this.entityData.get(ENERGY) + amount, MAX_ENERGY)); - } - - @Override - public boolean canCharge() { - return this.entityData.get(ENERGY) < MAX_ENERGY; + return MAX_ENERGY; } }