添加A10载具加力

This commit is contained in:
Atsuishio 2025-05-21 23:00:34 +08:00 committed by Light_Quanta
parent ed6d563118
commit 44fb0e83b2
No known key found for this signature in database
GPG key ID: 11A39A1B8C890959
4 changed files with 76 additions and 41 deletions

View file

@ -1,11 +1,13 @@
package com.atsuishio.superbwarfare.entity.projectile; package com.atsuishio.superbwarfare.entity.projectile;
import com.atsuishio.superbwarfare.config.server.ExplosionConfig;
import com.atsuishio.superbwarfare.entity.LoudlyEntity; import com.atsuishio.superbwarfare.entity.LoudlyEntity;
import com.atsuishio.superbwarfare.init.ModDamageTypes; import com.atsuishio.superbwarfare.init.ModDamageTypes;
import com.atsuishio.superbwarfare.init.ModEntities; import com.atsuishio.superbwarfare.init.ModEntities;
import com.atsuishio.superbwarfare.init.ModItems; import com.atsuishio.superbwarfare.init.ModItems;
import com.atsuishio.superbwarfare.init.ModSounds; import com.atsuishio.superbwarfare.init.ModSounds;
import com.atsuishio.superbwarfare.network.message.receive.ClientIndicatorMessage; import com.atsuishio.superbwarfare.network.message.receive.ClientIndicatorMessage;
import com.atsuishio.superbwarfare.tools.CustomExplosion;
import com.atsuishio.superbwarfare.tools.ParticleTool; import com.atsuishio.superbwarfare.tools.ParticleTool;
import com.atsuishio.superbwarfare.tools.ProjectileTool; import com.atsuishio.superbwarfare.tools.ProjectileTool;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
@ -21,11 +23,13 @@ import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.monster.Monster; import net.minecraft.world.entity.monster.Monster;
import net.minecraft.world.entity.projectile.ThrowableItemProjectile; import net.minecraft.world.entity.projectile.ThrowableItemProjectile;
import net.minecraft.world.item.Item; import net.minecraft.world.item.Item;
import net.minecraft.world.level.Explosion;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.BellBlock; import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.EntityHitResult;
import net.minecraft.world.phys.HitResult;
import net.neoforged.neoforge.event.EventHooks;
import net.neoforged.neoforge.network.PacketDistributor; import net.neoforged.neoforge.network.PacketDistributor;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.animatable.GeoEntity;
@ -90,7 +94,7 @@ public class RpgRocketEntity extends FastThrowableProjectile implements GeoEntit
} }
@Override @Override
public void addAdditionalSaveData(CompoundTag pCompound) { public void addAdditionalSaveData(@NotNull CompoundTag pCompound) {
super.addAdditionalSaveData(pCompound); super.addAdditionalSaveData(pCompound);
pCompound.putFloat("Damage", this.damage); pCompound.putFloat("Damage", this.damage);
pCompound.putFloat("ExplosionDamage", this.explosionDamage); pCompound.putFloat("ExplosionDamage", this.explosionDamage);
@ -98,7 +102,7 @@ public class RpgRocketEntity extends FastThrowableProjectile implements GeoEntit
} }
@Override @Override
public void readAdditionalSaveData(CompoundTag pCompound) { public void readAdditionalSaveData(@NotNull CompoundTag pCompound) {
super.readAdditionalSaveData(pCompound); super.readAdditionalSaveData(pCompound);
if (pCompound.contains("Damage")) { if (pCompound.contains("Damage")) {
this.damage = pCompound.getFloat("Damage"); this.damage = pCompound.getFloat("Damage");
@ -155,21 +159,47 @@ public class RpgRocketEntity extends FastThrowableProjectile implements GeoEntit
@Override @Override
public void onHitBlock(@NotNull BlockHitResult blockHitResult) { public void onHitBlock(@NotNull BlockHitResult blockHitResult) {
super.onHitBlock(blockHitResult); if (this.level() instanceof ServerLevel) {
BlockPos resultPos = blockHitResult.getBlockPos(); double x = blockHitResult.getLocation().x;
BlockState state = this.level().getBlockState(resultPos); double y = blockHitResult.getLocation().y;
double z = blockHitResult.getLocation().z;
if (state.getBlock() instanceof BellBlock bell) { if (ExplosionConfig.EXPLOSION_DESTROY.get()) {
bell.attemptToRing(this.level(), resultPos, blockHitResult.getDirection()); float hardness = this.level().getBlockState(BlockPos.containing(x, y, z)).getBlock().defaultDestroyTime();
} if (hardness <= 50) {
BlockPos blockPos = BlockPos.containing(x, y, z);
Block.dropResources(this.level().getBlockState(blockPos), this.level(), BlockPos.containing(x, y, z), null);
this.level().destroyBlock(blockPos, true);
}
}
if (this.tickCount > 1) { if (this.tickCount > 1) {
if (this.level() instanceof ServerLevel) { for (int i = 1; i < 3; i++) {
ProjectileTool.causeCustomExplode(this, this.explosionDamage, this.explosionRadius, this.monsterMultiplier); apExplode(blockHitResult, i);
}
if (this.level() instanceof ServerLevel) {
ProjectileTool.causeCustomExplode(this, this.explosionDamage, this.explosionRadius, this.monsterMultiplier);
}
} }
} }
}
this.discard(); private void apExplode(HitResult result, int index) {
CustomExplosion explosion = new CustomExplosion(this.level(), this,
ModDamageTypes.causeProjectileBoomDamage(this.level().registryAccess(),
this,
this.getOwner()),
explosionDamage,
result.getLocation().x + index * getDeltaMovement().normalize().x,
result.getLocation().y + index * getDeltaMovement().normalize().y,
result.getLocation().z + index * getDeltaMovement().normalize().z,
0.5f * explosionRadius,
ExplosionConfig.EXPLOSION_DESTROY.get() ? Explosion.BlockInteraction.DESTROY : Explosion.BlockInteraction.KEEP, true).
setDamageMultiplier(this.monsterMultiplier);
explosion.explode();
EventHooks.onExplosionStart(this.level(), explosion);
explosion.finalizeExplosion(false);
} }
@Override @Override
@ -218,12 +248,12 @@ public class RpgRocketEntity extends FastThrowableProjectile implements GeoEntit
} }
@Override @Override
public SoundEvent getCloseSound() { public @NotNull SoundEvent getCloseSound() {
return ModSounds.ROCKET_ENGINE.get(); return ModSounds.ROCKET_ENGINE.get();
} }
@Override @Override
public SoundEvent getSound() { public @NotNull SoundEvent getSound() {
return ModSounds.ROCKET_FLY.get(); return ModSounds.ROCKET_FLY.get();
} }

View file

@ -193,10 +193,10 @@ public class A10Entity extends ContainerMobileVehicleEntity implements GeoEntity
lockingTargetO = getTargetUuid(); lockingTargetO = getTargetUuid();
super.baseTick(); super.baseTick();
float f = (float) Mth.clamp(Math.max((onGround() ? 0.815f : 0.82f) - 0.0035 * getDeltaMovement().length(), 0.5) + 0.001f * Mth.abs(90 - (float) calculateAngle(this.getDeltaMovement(), this.getViewVector(1))) / 90, 0.01, 0.99); float f = (float) Mth.clamp(Math.max((onGround() ? 0.819f : 0.82f) - 0.0035 * getDeltaMovement().length(), 0.5) + 0.001f * Mth.abs(90 - (float) calculateAngle(this.getDeltaMovement(), this.getViewVector(1))) / 90, 0.01, 0.99);
boolean forward = getDeltaMovement().dot(getViewVector(1)) > 0; boolean forward = getDeltaMovement().dot(getViewVector(1)) > 0;
this.setDeltaMovement(this.getDeltaMovement().add(this.getViewVector(1).scale((forward ? 0.23 : 0.1) * getDeltaMovement().dot(getViewVector(1))))); this.setDeltaMovement(this.getDeltaMovement().add(this.getViewVector(1).scale((forward ? 0.227 : 0.1) * getDeltaMovement().dot(getViewVector(1)))));
this.setDeltaMovement(this.getDeltaMovement().multiply(f, f, f)); this.setDeltaMovement(this.getDeltaMovement().multiply(f, f, f));
if (this.isInWater() && this.tickCount % 4 == 0) { if (this.isInWater() && this.tickCount % 4 == 0) {
@ -471,7 +471,7 @@ public class A10Entity extends ContainerMobileVehicleEntity implements GeoEntity
} else if (passenger instanceof Player) { } else if (passenger instanceof Player) {
if (getEnergy() > 0) { if (getEnergy() > 0) {
if (forwardInputDown) { if (forwardInputDown) {
this.entityData.set(POWER, Math.min(this.entityData.get(POWER) + 0.004f, 1f)); this.entityData.set(POWER, Math.min(this.entityData.get(POWER) + 0.004f, sprintInputDown ? 1f : 0.0575f));
} }
if (backInputDown) { if (backInputDown) {
@ -488,7 +488,7 @@ public class A10Entity extends ContainerMobileVehicleEntity implements GeoEntity
} }
// 刹车 // 刹车
if (upInputDown) { if (downInputDown) {
if (onGround()) { if (onGround()) {
this.entityData.set(POWER, this.entityData.get(POWER) * 0.8f); this.entityData.set(POWER, this.entityData.get(POWER) * 0.8f);
this.setDeltaMovement(this.getDeltaMovement().multiply(0.97, 1, 0.97)); this.setDeltaMovement(this.getDeltaMovement().multiply(0.97, 1, 0.97));
@ -530,8 +530,8 @@ public class A10Entity extends ContainerMobileVehicleEntity implements GeoEntity
this.setPropellerRot(this.getPropellerRot() + 30 * this.entityData.get(POWER)); this.setPropellerRot(this.getPropellerRot() + 30 * this.entityData.get(POWER));
// 起落架 // 起落架
if (downInputDown) { if (upInputDown) {
downInputDown = false; upInputDown = false;
if (entityData.get(GEAR_ROT) == 0 && !onGround()) { if (entityData.get(GEAR_ROT) == 0 && !onGround()) {
entityData.set(GEAR_UP, true); entityData.set(GEAR_UP, true);
} else if (entityData.get(GEAR_ROT) == 85) { } else if (entityData.get(GEAR_ROT) == 85) {
@ -587,7 +587,7 @@ public class A10Entity extends ContainerMobileVehicleEntity implements GeoEntity
setDeltaMovement(getDeltaMovement().add(force.scale(getDeltaMovement().dot(getViewVector(1)) * 0.022 * (1 + Math.sin((onGround() ? 25 : flapAngle + 25) * Mth.DEG_TO_RAD))))); setDeltaMovement(getDeltaMovement().add(force.scale(getDeltaMovement().dot(getViewVector(1)) * 0.022 * (1 + Math.sin((onGround() ? 25 : flapAngle + 25) * Mth.DEG_TO_RAD)))));
this.setDeltaMovement(this.getDeltaMovement().add(getViewVector(1).scale(0.08 * this.entityData.get(POWER)))); this.setDeltaMovement(this.getDeltaMovement().add(getViewVector(1).scale(0.2 * this.entityData.get(POWER))));
} }
@Override @Override
@ -638,7 +638,6 @@ public class A10Entity extends ContainerMobileVehicleEntity implements GeoEntity
} }
collisionCoolDown = 4; collisionCoolDown = 4;
crash = true; crash = true;
this.entityData.set(POWER, 0.8f * entityData.get(POWER));
} }
} }
} }
@ -650,7 +649,7 @@ public class A10Entity extends ContainerMobileVehicleEntity implements GeoEntity
@Override @Override
public float getEngineSoundVolume() { public float getEngineSoundVolume() {
return entityData.get(POWER) * 1.5f; return entityData.get(POWER) * (sprintInputDown ? 5.5f : 3f);
} }
protected void clampRotation(Entity entity) { protected void clampRotation(Entity entity) {

View file

@ -80,6 +80,7 @@ public abstract class MobileVehicleEntity extends EnergyVehicleEntity implements
public boolean downInputDown; public boolean downInputDown;
public boolean decoyInputDown; public boolean decoyInputDown;
public boolean fireInputDown; public boolean fireInputDown;
public boolean sprintInputDown;
public double lastTickSpeed; public double lastTickSpeed;
public double lastTickVerticalSpeed; public double lastTickVerticalSpeed;
public int collisionCoolDown; public int collisionCoolDown;
@ -147,21 +148,23 @@ public abstract class MobileVehicleEntity extends EnergyVehicleEntity implements
@Override @Override
public void processInput(short keys) { public void processInput(short keys) {
leftInputDown leftInputDown
= (keys & 0b00000001) > 0; = (keys & 0b000000001) > 0;
rightInputDown rightInputDown
= (keys & 0b00000010) > 0; = (keys & 0b000000010) > 0;
forwardInputDown forwardInputDown
= (keys & 0b00000100) > 0; = (keys & 0b000000100) > 0;
backInputDown backInputDown
= (keys & 0b00001000) > 0; = (keys & 0b000001000) > 0;
upInputDown upInputDown
= (keys & 0b00010000) > 0; = (keys & 0b000010000) > 0;
downInputDown downInputDown
= (keys & 0b00100000) > 0; = (keys & 0b000100000) > 0;
decoyInputDown decoyInputDown
= (keys & 0b01000000) > 0; = (keys & 0b001000000) > 0;
fireInputDown fireInputDown
= (keys & 0b10000000) > 0; = (keys & 0b010000000) > 0;
sprintInputDown
= (keys & 0b100000000) > 0;
} }
@Override @Override

View file

@ -249,28 +249,31 @@ public class ClientEventHandler {
&& tag.getBoolean("Linked")) && tag.getBoolean("Linked"))
) { ) {
if (options.keyLeft.isDown()) { if (options.keyLeft.isDown()) {
keys |= 0b00000001; keys |= 0b000000001;
} }
if (options.keyRight.isDown()) { if (options.keyRight.isDown()) {
keys |= 0b00000010; keys |= 0b000000010;
} }
if (options.keyUp.isDown()) { if (options.keyUp.isDown()) {
keys |= 0b00000100; keys |= 0b000000100;
} }
if (options.keyDown.isDown()) { if (options.keyDown.isDown()) {
keys |= 0b00001000; keys |= 0b000001000;
} }
if (options.keyJump.isDown()) { if (options.keyJump.isDown()) {
keys |= 0b00010000; keys |= 0b000010000;
} }
if (options.keyShift.isDown()) { if (options.keyShift.isDown()) {
keys |= 0b00100000; keys |= 0b000100000;
} }
if (ModKeyMappings.RELEASE_DECOY.isDown()) { if (ModKeyMappings.RELEASE_DECOY.isDown()) {
keys |= 0b01000000; keys |= 0b001000000;
} }
if (holdFireVehicle) { if (holdFireVehicle) {
keys |= 0b10000000; keys |= 0b010000000;
}
if (options.keySprint.isDown()) {
keys |= 0b100000000;
} }
} }