diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Ah6Entity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Ah6Entity.java index bf4c63a5b..b685dbecf 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Ah6Entity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Ah6Entity.java @@ -611,6 +611,16 @@ public class Ah6Entity extends ContainerMobileEntity implements GeoEntity, IHeli return super.getDismountLocationForPassenger(passenger); } + @Override + public float ignoreExplosionHorizontalKnockBack() { + return -0.5f; + } + + @Override + public float ignoreExplosionVerticalKnockBack() { + return -0.9f; + } + @Override public boolean isDriver(Player player) { return player == this.getFirstPassenger(); diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/SpeedboatEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/SpeedboatEntity.java index 24a22641e..4b20757a8 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/SpeedboatEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/SpeedboatEntity.java @@ -181,7 +181,7 @@ public class SpeedboatEntity extends ContainerMobileEntity implements GeoEntity, } double fluidFloat; - fluidFloat = -0.06 + 0.12 * getSubmergedHeight(this); + fluidFloat = 0.12 * getSubmergedHeight(this); this.setDeltaMovement(this.getDeltaMovement().add(0.0, fluidFloat, 0.0)); if (this.onGround()) { @@ -452,6 +452,16 @@ public class SpeedboatEntity extends ContainerMobileEntity implements GeoEntity, return this.cache; } + @Override + public float ignoreExplosionHorizontalKnockBack() { + return -0.5f; + } + + @Override + public float ignoreExplosionVerticalKnockBack() { + return -0.9f; + } + @Override public int getMaxPassengers() { return 5; diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/VehicleEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/VehicleEntity.java index fa85a35cf..8c8ff8350 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/VehicleEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/VehicleEntity.java @@ -310,6 +310,14 @@ public class VehicleEntity extends Entity { public void travel() { } + public float ignoreExplosionHorizontalKnockBack() { + return -1f; + } + + public float ignoreExplosionVerticalKnockBack() { + return -1f; + } + // From Immersive_Aircraft public Matrix4f getVehicleTransform() { Matrix4f transform = new Matrix4f(); diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/WheelChairEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/WheelChairEntity.java index bba57df92..58feb5294 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/WheelChairEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/WheelChairEntity.java @@ -277,6 +277,16 @@ public class WheelChairEntity extends MobileVehicleEntity implements GeoEntity { } } + @Override + public float ignoreExplosionHorizontalKnockBack() { + return -0.2f; + } + + @Override + public float ignoreExplosionVerticalKnockBack() { + return -0.3f; + } + @Override public void registerControllers(AnimatableManager.ControllerRegistrar data) { } diff --git a/src/main/java/com/atsuishio/superbwarfare/tools/CustomExplosion.java b/src/main/java/com/atsuishio/superbwarfare/tools/CustomExplosion.java index e57efb9dc..d04bffc35 100644 --- a/src/main/java/com/atsuishio/superbwarfare/tools/CustomExplosion.java +++ b/src/main/java/com/atsuishio/superbwarfare/tools/CustomExplosion.java @@ -3,6 +3,7 @@ package com.atsuishio.superbwarfare.tools; import com.atsuishio.superbwarfare.ModUtils; import com.atsuishio.superbwarfare.config.server.ExplosionConfig; import com.atsuishio.superbwarfare.config.server.ExplosionDestroyConfig; +import com.atsuishio.superbwarfare.entity.vehicle.VehicleEntity; import com.atsuishio.superbwarfare.network.message.ShakeClientMessage; import com.google.common.collect.Sets; import net.minecraft.core.BlockPos; @@ -11,8 +12,10 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.util.Mth; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.item.PrimedTnt; import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.item.enchantment.ProtectionEnchantment; import net.minecraft.world.level.Explosion; import net.minecraft.world.level.ExplosionDamageCalculator; import net.minecraft.world.level.Level; @@ -167,6 +170,9 @@ public class CustomExplosion extends Explosion { double zDistance = entity.getZ() - this.z; double distance = Math.sqrt(xDistance * xDistance + yDistance * yDistance + zDistance * zDistance); if (distance != 0.0D) { + xDistance /= distance; + yDistance /= distance; + zDistance /= distance; double seenPercent = Mth.clamp(getSeenPercent(position, entity), 0.01 * ExplosionConfig.EXPLOSION_PENETRATION_RATIO.get(), Double.POSITIVE_INFINITY); double damagePercent = (1.0D - distanceRate) * seenPercent; @@ -180,6 +186,22 @@ public class CustomExplosion extends Explosion { if (fireTime > 0) { entity.setSecondsOnFire(fireTime); } + + double d11; + if (entity instanceof LivingEntity livingentity) { + d11 = ProtectionEnchantment.getExplosionKnockbackAfterDampener(livingentity, damagePercent); + } else { + d11 = damagePercent; + } + + xDistance *= d11; + yDistance *= d11; + zDistance *= d11; + + if (entity instanceof VehicleEntity vehicle) { + Vec3 knockbackVec = new Vec3(vehicle.ignoreExplosionHorizontalKnockBack() * xDistance, vehicle.ignoreExplosionVerticalKnockBack() * yDistance, vehicle.ignoreExplosionHorizontalKnockBack() * zDistance); + vehicle.setDeltaMovement(vehicle.getDeltaMovement().add(knockbackVec)); + } } } } diff --git a/src/main/java/com/atsuishio/superbwarfare/tools/ProjectileTool.java b/src/main/java/com/atsuishio/superbwarfare/tools/ProjectileTool.java index 87032bdef..92eb1a973 100644 --- a/src/main/java/com/atsuishio/superbwarfare/tools/ProjectileTool.java +++ b/src/main/java/com/atsuishio/superbwarfare/tools/ProjectileTool.java @@ -17,7 +17,7 @@ public class ProjectileTool { explosion.explode(); net.minecraftforge.event.ForgeEventFactory.onExplosionStart(projectile.level(), explosion); explosion.finalizeExplosion(false); - ParticleTool.spawnMediumExplosionParticles(projectile.level(), target.position()); + ParticleTool.spawnMediumExplosionParticles(projectile.level(), projectile.position()); projectile.discard(); }