通过神秘的办法让载具抵消大部分爆炸击退,修复快艇吃水深度bug

This commit is contained in:
Atsuihsio 2025-01-12 04:13:15 +08:00
parent 8c6ae814c9
commit 2f2052e331
6 changed files with 62 additions and 2 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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