From 9ad273d75037933c598f93e948a7a47f510932d5 Mon Sep 17 00:00:00 2001 From: Atsuishio <842960157@qq.com> Date: Tue, 15 Jul 2025 23:54:54 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=81=AB=E7=82=AE=E8=87=AA?= =?UTF-8?q?=E7=9E=84=EF=BC=8C=E6=B7=BB=E5=8A=A0=E5=90=84=E7=A7=8D=E7=9E=84?= =?UTF-8?q?=E5=87=86=E5=A4=B1=E8=B4=A5=E6=8F=90=E7=A4=BA=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/overlay/MortarInfoOverlay.java | 2 +- .../client/overlay/Type63InfoOverlay.java | 9 ++ .../entity/vehicle/Mk42Entity.java | 94 +++++++++++-------- .../entity/vehicle/Mle1934Entity.java | 93 ++++++++++-------- .../entity/vehicle/MortarEntity.java | 94 +++++++++++++------ .../entity/vehicle/Type63Entity.java | 5 + .../base/RemoteControllableTurret.java | 12 ++- .../item/ArtilleryIndicator.java | 6 +- .../assets/superbwarfare/lang/en_us.json | 4 + .../assets/superbwarfare/lang/zh_cn.json | 4 + .../data/superbwarfare/vehicles/type_63.json | 1 - 11 files changed, 205 insertions(+), 119 deletions(-) diff --git a/src/main/java/com/atsuishio/superbwarfare/client/overlay/MortarInfoOverlay.java b/src/main/java/com/atsuishio/superbwarfare/client/overlay/MortarInfoOverlay.java index 86c86b4d4..c1d36bd64 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/overlay/MortarInfoOverlay.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/overlay/MortarInfoOverlay.java @@ -41,7 +41,7 @@ public class MortarInfoOverlay implements LayeredDraw.Layer { .append(Component.literal(FormatTool.format1D(mortar.getYRot(), "°"))), w / 2 - 90, h / 2 - 16, -1, false); guiGraphics.drawString(Minecraft.getInstance().font, Component.translatable("tips.superbwarfare.mortar.range") - .append(Component.literal(FormatTool.format1D((int) RangeTool.getRange(-mortar.getXRot(), 13, 0.11), "m"))), + .append(Component.literal(FormatTool.format1D((int) RangeTool.getRange(-mortar.getXRot(), mortar.shootVelocity(), -mortar.projectileGravity()), "m"))), w / 2 - 90, h / 2 - 6, -1, false); } } diff --git a/src/main/java/com/atsuishio/superbwarfare/client/overlay/Type63InfoOverlay.java b/src/main/java/com/atsuishio/superbwarfare/client/overlay/Type63InfoOverlay.java index e28293068..8654acc21 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/overlay/Type63InfoOverlay.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/overlay/Type63InfoOverlay.java @@ -107,6 +107,11 @@ public class Type63InfoOverlay implements LayeredDraw.Layer { } ItemStack stack = player.getOffhandItem(); + + if (player.getMainHandItem().getItem() instanceof FiringParameters) { + stack = player.getMainHandItem(); + } + if (stack.getItem() instanceof FiringParameters) { var parameters = stack.get(ModDataComponents.FIRING_PARAMETERS); if (parameters == null) { @@ -148,6 +153,10 @@ public class Type63InfoOverlay implements LayeredDraw.Layer { if (angle < -5 || angle > 60) { guiGraphics.drawString(Minecraft.getInstance().font, Component.translatable("tips.superbwarfare.mortar.warn", lookingEntity.getDisplayName()).withStyle(ChatFormatting.RED), screenWidth / 2 + 90, screenHeight / 2 + 4, -1, false); + if (angle > 60 && !isDepressed) { + guiGraphics.drawString(Minecraft.getInstance().font, Component.translatable("tips.superbwarfare.ballistics.warn").withStyle(ChatFormatting.RED), + screenWidth / 2 + 90, screenHeight / 2 + 14, -1, false); + } } } } diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Mk42Entity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Mk42Entity.java index cb82b8806..dc31b0866 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Mk42Entity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Mk42Entity.java @@ -70,8 +70,6 @@ public class Mk42Entity extends VehicleEntity implements GeoEntity, CannonEntity public static final EntityDataAccessor TARGET_POS = SynchedEntityData.defineId(Mk42Entity.class, EntityDataSerializers.VECTOR3); public static final EntityDataAccessor RADIUS = SynchedEntityData.defineId(Mk42Entity.class, EntityDataSerializers.INT); - private final float shellGravity = 0.1f; - public Mk42Entity(EntityType type, Level world) { super(type, world); } @@ -97,7 +95,7 @@ public class Mk42Entity extends VehicleEntity implements GeoEntity, CannonEntity .explosionDamage(VehicleConfig.MK42_AP_EXPLOSION_DAMAGE.get()) .explosionRadius(VehicleConfig.MK42_AP_EXPLOSION_RADIUS.get().floatValue()) .durability(60) - .gravity(shellGravity) + .gravity(projectileGravity()) .sound(ModSounds.CANNON_RELOAD.get()) .icon(Mod.loc("textures/screens/vehicle_weapon/ap_shell.png")), new CannonShellWeapon() @@ -107,7 +105,7 @@ public class Mk42Entity extends VehicleEntity implements GeoEntity, CannonEntity .durability(1) .fireProbability(0.18F) .fireTime(2) - .gravity(shellGravity) + .gravity(projectileGravity()) .sound(ModSounds.CANNON_RELOAD.get()) .icon(Mod.loc("textures/screens/vehicle_weapon/he_shell.png")), } @@ -182,69 +180,65 @@ public class Mk42Entity extends VehicleEntity implements GeoEntity, CannonEntity } if (player.getMainHandItem().getItem() == ModItems.FIRING_PARAMETERS.get()) { - if (setTarget(player.getMainHandItem())) { - player.swing(InteractionHand.MAIN_HAND); - return InteractionResult.SUCCESS; - } else { - player.displayClientMessage(Component.translatable("tips.superbwarfare.mortar.warn", this.getDisplayName()).withStyle(ChatFormatting.RED), true); - return InteractionResult.FAIL; - } + setTarget(player.getMainHandItem(), player); } if (player.getOffhandItem().getItem() == ModItems.FIRING_PARAMETERS.get()) { - if (setTarget(player.getOffhandItem())) { - player.swing(InteractionHand.OFF_HAND); - return InteractionResult.SUCCESS; - } else { - player.displayClientMessage(Component.translatable("tips.superbwarfare.mortar.warn", this.getDisplayName()).withStyle(ChatFormatting.RED), true); - return InteractionResult.FAIL; - } + setTarget(player.getMainHandItem(), player); } return super.interact(player, hand); } @Override - public boolean setTarget(ItemStack stack) { + public void setTarget(ItemStack stack, Entity entity) { var parameters = stack.get(ModDataComponents.FIRING_PARAMETERS); - if (parameters == null) return false; + if (parameters == null) return; var pos = parameters.pos(); int targetX = pos.getX(); int targetY = pos.getY(); int targetZ = pos.getZ(); var isDepressed = parameters.isDepressed(); + var radius = parameters.radius(); - Matrix4f transform = getVehicleFlatTransform(1); - Vector4f worldPosition = transformPosition(transform, 0f, 2.16f, 0.5175f); - Vec3 shootPos = new Vec3(worldPosition.x, worldPosition.y, worldPosition.z); - double adjust = -1 + 0.004 * new Vec3(targetX, targetY, targetZ).distanceTo(shootPos); + boolean canAim = true; - entityData.set(TARGET_POS, new Vector3f((float) targetX, (float) (targetY - adjust), (float) targetZ)); + entityData.set(TARGET_POS, new Vector3f((float) targetX, (float) targetY, (float) targetZ)); entityData.set(DEPRESSED, isDepressed); - entityData.set(RADIUS, parameters.radius()); + entityData.set(RADIUS, radius); Vec3 randomPos = VectorTool.randomPos(new Vec3(entityData.get(TARGET_POS)), entityData.get(RADIUS)); + Vec3 launchVector = calculateLaunchVector(getEyePosition(), randomPos, shootVelocity(), projectileGravity(), entityData.get(DEPRESSED)); - try { - Vec3 launchVector = calculateLaunchVector(getEyePosition(), randomPos, 15, -shellGravity, entityData.get(DEPRESSED)); - this.look(randomPos); + Component component = Component.literal(""); + Component location = Component.translatable("tips.superbwarfare.mortar.position", this.getDisplayName()) + .append(Component.literal(" X:" + FormatTool.format0D(getX()) + " Y:" + FormatTool.format0D(getY()) + " Z:" + FormatTool.format0D(getZ()) + " ")); + float angle = getXRot(); - if (launchVector == null) { - return false; + if (launchVector == null) { + canAim = false; + component = Component.translatable("tips.superbwarfare.mortar.out_of_range"); + } else { + angle = (float) -getXRotFromVector(launchVector); + if (angle < -maxPitch() || angle > -minPitch()) { + canAim = false; + component = Component.translatable("tips.superbwarfare.mortar.warn", this.getDisplayName()); + if (angle < -maxPitch()) { + component = Component.translatable("tips.superbwarfare.ballistics.warn"); + } } - float angle = (float) -getXRotFromVector(launchVector); - if (angle < -85 || angle > 14.9) { - return false; - } - entityData.set(PITCH, angle); - } catch (Exception e) { - return false; } - return true; + + if (canAim) { + this.look(randomPos); + entityData.set(PITCH, angle); + } else if (entity instanceof Player player) { + player.displayClientMessage(location.copy().append(component).withStyle(ChatFormatting.RED), false); + } } @Override public void resetTarget() { Vec3 randomPos = VectorTool.randomPos(new Vec3(entityData.get(TARGET_POS)), entityData.get(RADIUS)); - Vec3 launchVector = calculateLaunchVector(getEyePosition(), randomPos, 15, -shellGravity, entityData.get(DEPRESSED)); + Vec3 launchVector = calculateLaunchVector(getEyePosition(), randomPos, 15, projectileGravity(), entityData.get(DEPRESSED)); this.look(randomPos); if (launchVector == null) { @@ -256,6 +250,26 @@ public class Mk42Entity extends VehicleEntity implements GeoEntity, CannonEntity } } + @Override + public double minPitch() { + return -14.9; + } + + @Override + public double maxPitch() { + return 85; + } + + @Override + public double shootVelocity() { + return 15; + } + + @Override + public float projectileGravity() { + return -0.1f; + } + @Override public void look(Vec3 pTarget) { Matrix4f transform = getVehicleFlatTransform(1); diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Mle1934Entity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Mle1934Entity.java index cb1a887da..683cdd89f 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Mle1934Entity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Mle1934Entity.java @@ -73,8 +73,6 @@ public class Mle1934Entity extends VehicleEntity implements GeoEntity, CannonEnt private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - private final float shellGravity = 0.1f; - public Mle1934Entity(EntityType type, Level world) { super(type, world); } @@ -88,7 +86,7 @@ public class Mle1934Entity extends VehicleEntity implements GeoEntity, CannonEnt .explosionDamage(VehicleConfig.MLE1934_AP_EXPLOSION_DAMAGE.get()) .explosionRadius(VehicleConfig.MLE1934_AP_EXPLOSION_RADIUS.get().floatValue()) .durability(70) - .gravity(shellGravity) + .gravity(projectileGravity()) .sound(ModSounds.CANNON_RELOAD.get()) .icon(Mod.loc("textures/screens/vehicle_weapon/ap_shell.png")), new CannonShellWeapon() @@ -98,7 +96,7 @@ public class Mle1934Entity extends VehicleEntity implements GeoEntity, CannonEnt .durability(1) .fireProbability(0.24F) .fireTime(5) - .gravity(shellGravity) + .gravity(projectileGravity()) .sound(ModSounds.CANNON_RELOAD.get()) .icon(Mod.loc("textures/screens/vehicle_weapon/he_shell.png")), } @@ -200,70 +198,63 @@ public class Mle1934Entity extends VehicleEntity implements GeoEntity, CannonEnt } if (player.getMainHandItem().getItem() == ModItems.FIRING_PARAMETERS.get()) { - if (setTarget(player.getMainHandItem())) { - player.swing(InteractionHand.MAIN_HAND); - return InteractionResult.SUCCESS; - } else { - player.displayClientMessage(Component.translatable("tips.superbwarfare.mortar.warn", this.getDisplayName()).withStyle(ChatFormatting.RED), true); - return InteractionResult.FAIL; - } + setTarget(player.getMainHandItem(), player); } if (player.getOffhandItem().getItem() == ModItems.FIRING_PARAMETERS.get()) { - if (setTarget(player.getOffhandItem())) { - player.swing(InteractionHand.OFF_HAND); - return InteractionResult.SUCCESS; - } else { - player.displayClientMessage(Component.translatable("tips.superbwarfare.mortar.warn", this.getDisplayName()).withStyle(ChatFormatting.RED), true); - return InteractionResult.FAIL; - } + setTarget(player.getMainHandItem(), player); } return super.interact(player, hand); } //这个炮仰角太低只能用低伸弹道 @Override - public boolean setTarget(ItemStack stack) { + public void setTarget(ItemStack stack, Entity entity) { var parameters = stack.get(ModDataComponents.FIRING_PARAMETERS); - if (parameters == null) return false; + if (parameters == null) return; var pos = parameters.pos(); int targetX = pos.getX(); int targetY = pos.getY(); int targetZ = pos.getZ(); -// var isDepressed = parameters.isDepressed(); + boolean canAim = true; - Matrix4f transform = getVehicleFlatTransform(1); - Vector4f worldPosition = transformPosition(transform, 0, 1.4992625f, 1.52065f); - Vec3 shootPos = new Vec3(worldPosition.x, worldPosition.y, worldPosition.z); - double adjust = -1 + 0.004 * new Vec3(targetX, targetY, targetZ).distanceTo(shootPos); - - entityData.set(TARGET_POS, new Vector3f((float) targetX, (float) (targetY - adjust), (float) targetZ)); + entityData.set(TARGET_POS, new Vector3f((float) targetX, (float) targetY, (float) targetZ)); entityData.set(DEPRESSED, true); entityData.set(RADIUS, parameters.radius()); Vec3 randomPos = VectorTool.randomPos(new Vec3(entityData.get(TARGET_POS)), entityData.get(RADIUS)); + Vec3 launchVector = calculateLaunchVector(getEyePosition(), randomPos, shootVelocity(), projectileGravity(), entityData.get(DEPRESSED)); - try { - Vec3 launchVector = calculateLaunchVector(getEyePosition(), randomPos, 15, -shellGravity, entityData.get(DEPRESSED)); - this.look(randomPos); + Component component = Component.literal(""); + Component location = Component.translatable("tips.superbwarfare.mortar.position", this.getDisplayName()) + .append(Component.literal(" X:" + FormatTool.format0D(getX()) + " Y:" + FormatTool.format0D(getY()) + " Z:" + FormatTool.format0D(getZ()) + " ")); + float angle = getXRot(); - if (launchVector == null) { - return false; + if (launchVector == null) { + canAim = false; + component = Component.translatable("tips.superbwarfare.mortar.out_of_range"); + } else { + angle = (float) -getXRotFromVector(launchVector); + if (angle < -maxPitch() || angle > -minPitch()) { + canAim = false; + component = Component.translatable("tips.superbwarfare.mortar.warn", this.getDisplayName()); + if (angle < -maxPitch()) { + component = Component.translatable("tips.superbwarfare.ballistics.warn"); + } } - float angle = (float) -getXRotFromVector(launchVector); - if (angle < -30 || angle > 2.7) { - return false; - } - entityData.set(PITCH, angle); - } catch (Exception e) { - return false; } - return true; + + if (canAim) { + this.look(randomPos); + entityData.set(PITCH, angle); + } else if (entity instanceof Player player) { + player.displayClientMessage(location.copy().append(component).withStyle(ChatFormatting.RED), false); + } } @Override public void resetTarget() { Vec3 randomPos = VectorTool.randomPos(new Vec3(entityData.get(TARGET_POS)), entityData.get(RADIUS)); - Vec3 launchVector = calculateLaunchVector(getEyePosition(), randomPos, 15, -shellGravity, entityData.get(DEPRESSED)); + Vec3 launchVector = calculateLaunchVector(getEyePosition(), randomPos, 15, projectileGravity(), entityData.get(DEPRESSED)); this.look(randomPos); if (launchVector == null) { @@ -275,6 +266,26 @@ public class Mle1934Entity extends VehicleEntity implements GeoEntity, CannonEnt } } + @Override + public double minPitch() { + return -2.7; + } + + @Override + public double maxPitch() { + return 30; + } + + @Override + public double shootVelocity() { + return 15; + } + + @Override + public float projectileGravity() { + return -0.1f; + } + @Override public void look(Vec3 pTarget) { Matrix4f transform = getVehicleFlatTransform(1); diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/MortarEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/MortarEntity.java index 8a96c8b8d..1a862064e 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/MortarEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/MortarEntity.java @@ -12,6 +12,7 @@ import com.atsuishio.superbwarfare.item.ArtilleryIndicator; import com.atsuishio.superbwarfare.item.Monitor; import com.atsuishio.superbwarfare.item.common.ammo.MortarShell; import com.atsuishio.superbwarfare.network.message.receive.ShakeClientMessage; +import com.atsuishio.superbwarfare.tools.FormatTool; import com.atsuishio.superbwarfare.tools.VectorTool; import net.minecraft.ChatFormatting; import net.minecraft.commands.arguments.EntityAnchorArgument; @@ -28,6 +29,7 @@ import net.minecraft.sounds.SoundSource; import net.minecraft.util.Mth; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.MoverType; @@ -160,6 +162,26 @@ public class MortarEntity extends VehicleEntity implements GeoEntity, RemoteCont this.fire(player); } + @Override + public double minPitch() { + return 20; + } + + @Override + public double maxPitch() { + return 89; + } + + @Override + public double shootVelocity() { + return 10; + } + + @Override + public float projectileGravity() { + return -0.13f; + } + @Override public @NotNull InteractionResult interact(Player player, @NotNull InteractionHand hand) { ItemStack mainHandItem = player.getMainHandItem(); @@ -194,22 +216,10 @@ public class MortarEntity extends VehicleEntity implements GeoEntity, RemoteCont } if (player.getMainHandItem().getItem() == ModItems.FIRING_PARAMETERS.get()) { - if (setTarget(player.getMainHandItem())) { - player.swing(InteractionHand.MAIN_HAND); - return InteractionResult.SUCCESS; - } else { - player.displayClientMessage(Component.translatable("tips.superbwarfare.mortar.warn", this.getDisplayName()).withStyle(ChatFormatting.RED), true); - return InteractionResult.FAIL; - } + setTarget(player.getMainHandItem(), player); } if (player.getOffhandItem().getItem() == ModItems.FIRING_PARAMETERS.get()) { - if (setTarget(player.getOffhandItem())) { - player.swing(InteractionHand.OFF_HAND); - return InteractionResult.SUCCESS; - } else { - player.displayClientMessage(Component.translatable("tips.superbwarfare.mortar.warn", this.getDisplayName()).withStyle(ChatFormatting.RED), true); - return InteractionResult.FAIL; - } + setTarget(player.getMainHandItem(), player); } if (player.isShiftKeyDown()) { @@ -228,9 +238,9 @@ public class MortarEntity extends VehicleEntity implements GeoEntity, RemoteCont } @Override - public boolean setTarget(ItemStack stack) { + public void setTarget(ItemStack stack, Entity entity) { var parameters = stack.get(ModDataComponents.FIRING_PARAMETERS); - if (parameters == null) return false; + if (parameters == null) return; var pos = parameters.pos(); double targetX = pos.getX(); @@ -238,33 +248,57 @@ public class MortarEntity extends VehicleEntity implements GeoEntity, RemoteCont double targetZ = pos.getZ(); var isDepressed = parameters.isDepressed(); + boolean canAim = true; + entityData.set(TARGET_POS, new Vector3f((float) targetX, (float) targetY, (float) targetZ)); entityData.set(DEPRESSED, isDepressed); entityData.set(RADIUS, parameters.radius()); Vec3 randomPos = VectorTool.randomPos(new Vec3(entityData.get(TARGET_POS)), entityData.get(RADIUS)); + Vec3 launchVector = calculateLaunchVector(getEyePosition(), randomPos, shootVelocity(), projectileGravity(), entityData.get(DEPRESSED)); + Vec3 launchVector2 = calculateLaunchVector(getEyePosition(), randomPos, shootVelocity(), projectileGravity(), !entityData.get(DEPRESSED)); - try { - Vec3 launchVector = calculateLaunchVector(getEyePosition(), randomPos, 13, -0.11, entityData.get(DEPRESSED)); - this.look(randomPos); + Component component = Component.literal(""); + Component location = Component.translatable("tips.superbwarfare.mortar.position", this.getDisplayName()) + .append(Component.literal(" X:" + FormatTool.format0D(getX()) + " Y:" + FormatTool.format0D(getY()) + " Z:" + FormatTool.format0D(getZ()) + " ")); + float angle = getXRot(); - if (launchVector == null) { - return false; + if (launchVector == null || launchVector2 == null) { + canAim = false; + component = Component.translatable("tips.superbwarfare.mortar.out_of_range"); + } else { + angle = (float) -getXRotFromVector(launchVector); + float angle2 = (float) -getXRotFromVector(launchVector2); + if (angle < -maxPitch() || angle > -minPitch()) { + if (angle2 > -maxPitch() && angle2 < -minPitch()) { + component = Component.translatable("tips.superbwarfare.ballistics.warn2"); + canAim = false; + } else { + component = Component.translatable("tips.superbwarfare.mortar.warn", this.getDisplayName()); + if (entity instanceof Player player) { + player.displayClientMessage(location.copy().append(component).withStyle(ChatFormatting.RED), false); + } + return; + } } - float angle = (float) -getXRotFromVector(launchVector); - if (angle < -89 || angle > -20) { - return false; + + if (angle < -maxPitch()) { + component = Component.translatable("tips.superbwarfare.ballistics.warn"); + canAim = false; } - entityData.set(PITCH, angle); - } catch (Exception e) { - return false; } - return true; + + if (canAim) { + this.look(randomPos); + entityData.set(PITCH, angle); + } else if (entity instanceof Player player) { + player.displayClientMessage(location.copy().append(component).withStyle(ChatFormatting.RED), false); + } } @Override public void resetTarget() { Vec3 randomPos = VectorTool.randomPos(new Vec3(entityData.get(TARGET_POS)), entityData.get(RADIUS)); - Vec3 launchVector = calculateLaunchVector(getEyePosition(), randomPos, 13, -0.11, entityData.get(DEPRESSED)); + Vec3 launchVector = calculateLaunchVector(getEyePosition(), randomPos, shootVelocity(), projectileGravity(), entityData.get(DEPRESSED)); this.look(randomPos); if (launchVector == null) { @@ -302,7 +336,7 @@ public class MortarEntity extends VehicleEntity implements GeoEntity, RemoteCont if (level instanceof ServerLevel server) { MortarShellEntity entityToSpawn = MortarShell.createShell(shooter, level, this.items.getFirst()); entityToSpawn.setPos(this.getX(), this.getEyeY(), this.getZ()); - entityToSpawn.shoot(this.getLookAngle().x, this.getLookAngle().y, this.getLookAngle().z, 13f, (float) 0.1); + entityToSpawn.shoot(this.getLookAngle().x, this.getLookAngle().y, this.getLookAngle().z, (float) shootVelocity(), (float) 0.1); level.addFreshEntity(entityToSpawn); server.sendParticles(ParticleTypes.CAMPFIRE_COSY_SMOKE, (this.getX() + 3 * this.getLookAngle().x), (this.getY() + 0.1 + 3 * this.getLookAngle().y), (this.getZ() + 3 * this.getLookAngle().z), 8, 0.4, 0.4, 0.4, 0.007); diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Type63Entity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Type63Entity.java index fbd25c9a9..aac7a5f50 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Type63Entity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Type63Entity.java @@ -561,4 +561,9 @@ public class Type63Entity extends ContainerMobileVehicleEntity implements GeoEnt } this.entityData.set(LOADED_AMMO, list); } + + @Override + public boolean hasEnergyStorage() { + return false; + } } diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/RemoteControllableTurret.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/RemoteControllableTurret.java index 9815f67d2..d353abd9f 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/RemoteControllableTurret.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/RemoteControllableTurret.java @@ -1,5 +1,6 @@ package com.atsuishio.superbwarfare.entity.vehicle.base; +import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.phys.Vec3; @@ -8,7 +9,7 @@ import javax.annotation.Nullable; public interface RemoteControllableTurret { - boolean setTarget(ItemStack stack); + void setTarget(ItemStack stack, Entity entity); void resetTarget(); @@ -17,4 +18,13 @@ public interface RemoteControllableTurret { boolean canRemoteFire(); void remoteFire(@Nullable Player player); + + double minPitch(); + + double maxPitch(); + + double shootVelocity(); + + float projectileGravity(); + } diff --git a/src/main/java/com/atsuishio/superbwarfare/item/ArtilleryIndicator.java b/src/main/java/com/atsuishio/superbwarfare/item/ArtilleryIndicator.java index fcd20c101..a01137db6 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/ArtilleryIndicator.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/ArtilleryIndicator.java @@ -150,11 +150,7 @@ public class ArtilleryIndicator extends Item implements ItemScreenProvider { if (entity instanceof RemoteControllableTurret lockTargetEntity) { list.add(tag); - - if (!lockTargetEntity.setTarget(stack)) { - player.displayClientMessage(Component.translatable("tips.superbwarfare.mortar.warn", entity.getDisplayName()) - .withStyle(ChatFormatting.RED), true); - } + lockTargetEntity.setTarget(stack, player); } } diff --git a/src/main/resources/assets/superbwarfare/lang/en_us.json b/src/main/resources/assets/superbwarfare/lang/en_us.json index 92a69f475..856236b86 100644 --- a/src/main/resources/assets/superbwarfare/lang/en_us.json +++ b/src/main/resources/assets/superbwarfare/lang/en_us.json @@ -598,6 +598,10 @@ "tips.superbwarfare.mortar.target_pos.depressed_trajectory": "Depressed Trajectory", "tips.superbwarfare.mortar.target_pos.lofted_trajectory": "Lofted Trajectory", "tips.superbwarfare.mortar.warn": "%1$s cannot aim at this position", + "tips.superbwarfare.mortar.position": "%1$s located in", + "tips.superbwarfare.ballistics.warn": "Use Depressed Trajectory Please", + "tips.superbwarfare.ballistics.warn2": "Use Lofted Trajectory Please", + "tips.superbwarfare.target.yaw": "Target Yaw: ", "tips.superbwarfare.target.pitch": "Target Pitch: ", "tips.superbwarfare.barrel_empty": "EMPTY", diff --git a/src/main/resources/assets/superbwarfare/lang/zh_cn.json b/src/main/resources/assets/superbwarfare/lang/zh_cn.json index 6ab00f1ad..60157395a 100644 --- a/src/main/resources/assets/superbwarfare/lang/zh_cn.json +++ b/src/main/resources/assets/superbwarfare/lang/zh_cn.json @@ -598,6 +598,10 @@ "tips.superbwarfare.mortar.target_pos.depressed_trajectory": "低伸弹道", "tips.superbwarfare.mortar.target_pos.lofted_trajectory": "传统弹道", "tips.superbwarfare.mortar.warn": "%1$s无法瞄准该位置", + "tips.superbwarfare.mortar.position": "%1$s位于", + "tips.superbwarfare.ballistics.warn": "请使用低伸弹道", + "tips.superbwarfare.ballistics.warn2": "请使用传统弹道", + "tips.superbwarfare.target.yaw": "目标偏航角: ", "tips.superbwarfare.target.pitch": "目标俯仰角: ", "tips.superbwarfare.barrel_empty": "空", diff --git a/src/main/resources/data/superbwarfare/vehicles/type_63.json b/src/main/resources/data/superbwarfare/vehicles/type_63.json index a5dd1f492..f5c021bb9 100644 --- a/src/main/resources/data/superbwarfare/vehicles/type_63.json +++ b/src/main/resources/data/superbwarfare/vehicles/type_63.json @@ -1,7 +1,6 @@ { "ID": "superbwarfare:type_63", "MaxHealth": 100, - "MaxEnergy": 24000, "Mass": 0.45, "DamageModifiers": [ {