From 53a1536d3431a42a83451eaba0acf8dce338d44d Mon Sep 17 00:00:00 2001 From: Atsuishio <842960157@qq.com> Date: Fri, 2 May 2025 01:26:22 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=85=89=E6=A3=B1=E6=B8=B2?= =?UTF-8?q?=E6=9F=93=E3=80=82=E4=BF=AE=E5=A4=8D=E5=9C=B0=E5=BD=A2=E8=AE=A1?= =?UTF-8?q?=E7=AE=97bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../renderer/entity/PrismTankRenderer.java | 28 ++-- .../entity/vehicle/PrismTankEntity.java | 26 ++- .../vehicle/base/MobileVehicleEntity.java | 2 + .../event/ClientEventHandler.java | 8 - .../superbwarfare/init/ModSounds.java | 1 - .../superbwarfare/geo/prism_tank.geo.json | 156 ++++++++++-------- .../assets/superbwarfare/sounds.json | 8 - .../sounds/hpj11/hpj_11_fire_1p.ogg | Bin 8485 -> 0 bytes 8 files changed, 116 insertions(+), 113 deletions(-) delete mode 100644 src/main/resources/assets/superbwarfare/sounds/hpj11/hpj_11_fire_1p.ogg diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/entity/PrismTankRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/entity/PrismTankRenderer.java index 960d02e58..1eb8b7f07 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/renderer/entity/PrismTankRenderer.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/entity/PrismTankRenderer.java @@ -11,10 +11,12 @@ import com.mojang.math.Axis; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.culling.Frustum; import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.phys.AABB; import software.bernie.geckolib.cache.object.BakedGeoModel; import software.bernie.geckolib.cache.object.GeoBone; import software.bernie.geckolib.renderer.GeoEntityRenderer; @@ -55,6 +57,19 @@ public class PrismTankRenderer extends GeoEntityRenderer { @Override public void renderRecursively(PoseStack poseStack, PrismTankEntity animatable, GeoBone bone, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int color) { String name = bone.getName(); + + Minecraft minecraft = Minecraft.getInstance(); + Frustum pCamera = minecraft.levelRenderer.getFrustum(); + + AABB aabb = animatable.getBoundingBoxForCulling().inflate(0.5); + if (aabb.hasNaN() || aabb.getSize() == 0.0) { + aabb = new AABB(animatable.getX() - 4.0, animatable.getY() - 3.0, animatable.getZ() - 4.0, animatable.getX() + 4.0, animatable.getY() + 3.0, animatable.getZ() + 4.0); + } + + if (name.equals("root")) { + bone.setHidden(!pCamera.isVisible(aabb)); + } + for (int i = 0; i < 8; i++) { if (name.equals("wheelL" + i)) { bone.setRotX(1.5f * Mth.lerp(partialTick, animatable.leftWheelRotO, animatable.getLeftWheelRot())); @@ -64,11 +79,11 @@ public class PrismTankRenderer extends GeoEntityRenderer { } } - if (name.equals("cannon")) { + if (name.equals("cannon") || name.equals("cannon2")) { bone.setRotY(Mth.lerp(partialTick, animatable.turretYRotO, animatable.getTurretYRot()) * Mth.DEG_TO_RAD); } - if (name.equals("head")) { + if (name.equals("head") || name.equals("head2")) { Player player = Minecraft.getInstance().player; bone.setHidden(ClientEventHandler.zoomVehicle && animatable.getFirstPassenger() == player); } @@ -89,7 +104,7 @@ public class PrismTankRenderer extends GeoEntityRenderer { bone.setRotY((System.currentTimeMillis() % 36000000) / 75f); } - if (name.equals("barrel")) { + if (name.equals("barrel") || name.equals("barrel2")) { float a = animatable.getTurretYaw(partialTick); float r = (Mth.abs(a) - 90f) / 90f; @@ -113,13 +128,6 @@ public class PrismTankRenderer extends GeoEntityRenderer { ); } - if (name.equals("flare")) { - bone.setRotZ((float) (0.5 * (Math.random() - 0.5))); - } - if (name.equals("flare2")) { - bone.setRotZ((float) (0.5 * (Math.random() - 0.5))); - } - for (int i = 0; i < 51; i++) { float tO = animatable.leftTrackO + 2 * i; float t = animatable.getLeftTrack() + 2 * i; diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/PrismTankEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/PrismTankEntity.java index 1012f5654..1e705d55a 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/PrismTankEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/PrismTankEntity.java @@ -17,10 +17,7 @@ import com.atsuishio.superbwarfare.init.ModSounds; import com.atsuishio.superbwarfare.init.ModTags; import com.atsuishio.superbwarfare.network.message.receive.ClientIndicatorMessage; import com.atsuishio.superbwarfare.network.message.receive.ShakeClientMessage; -import com.atsuishio.superbwarfare.tools.CustomExplosion; -import com.atsuishio.superbwarfare.tools.EntityFindUtil; -import com.atsuishio.superbwarfare.tools.ParticleTool; -import com.atsuishio.superbwarfare.tools.SeekTool; +import com.atsuishio.superbwarfare.tools.*; import com.mojang.math.Axis; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.Font; @@ -224,6 +221,10 @@ public class PrismTankEntity extends ContainerMobileVehicleEntity implements Geo releaseSmokeDecoy(); + if (this.getFirstPassenger() instanceof Player player && fireInputDown && getWeaponIndex(0) == 1 && getEnergy() > VehicleConfig.PRISM_TANK_SHOOT_COST_MODE_2.get() && !cannotFire) { + vehicleShoot(player, 0); + } + lowHealthWarning(); this.refreshDimensions(); } @@ -329,6 +330,10 @@ public class PrismTankEntity extends ContainerMobileVehicleEntity implements Geo } Level level = player.level(); + + float pitch = entityData.get(HEAT) <= 60 ? 1.1f : (float) (1.1f - 0.011 * Math.abs(60 - entityData.get(HEAT))); + SoundTool.playLocalSound(player, ModSounds.PRISM_FIRE_1P_2.get(), 1f, pitch); + if (level instanceof ServerLevel) { if (!player.level().isClientSide) { if (player instanceof ServerPlayer serverPlayer) { @@ -340,13 +345,6 @@ public class PrismTankEntity extends ContainerMobileVehicleEntity implements Geo this.consumeEnergy(VehicleConfig.PRISM_TANK_SHOOT_COST_MODE_2.get()); } - final Vec3 center = new Vec3(this.getX(), this.getEyeY(), this.getZ()); - for (Entity target : level.getEntitiesOfClass(Entity.class, new AABB(center, center).inflate(2), e -> true).stream().sorted(Comparator.comparingDouble(e -> e.distanceToSqr(center))).toList()) { - if (target instanceof ServerPlayer serverPlayer) { - PacketDistributor.sendToPlayer(serverPlayer, new ShakeClientMessage(5, 3, 3, this.getX(), this.getEyeY(), this.getZ())); - } - } - float dis = laserLengthEntity(root); if (dis < laserLength(root)) { @@ -738,17 +736,15 @@ public class PrismTankEntity extends ContainerMobileVehicleEntity implements Geo if (getWeaponIndex(0) == 0) { return 30; } else if (getWeaponIndex(0) == 1) { - return 1200; + return 0; } - return 20; + return 30; } @Override public boolean canShoot(Player player) { if (getWeaponIndex(0) == 0) { return getEnergy() > VehicleConfig.PRISM_TANK_SHOOT_COST_MODE_1.get() && !cannotFire; - } else if (getWeaponIndex(0) == 1) { - return getEnergy() > VehicleConfig.PRISM_TANK_SHOOT_COST_MODE_2.get() && !cannotFire; } return false; } diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/MobileVehicleEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/MobileVehicleEntity.java index 442182e0f..94afaf0d7 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/MobileVehicleEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/MobileVehicleEntity.java @@ -428,6 +428,8 @@ public abstract class MobileVehicleEntity extends EnergyVehicleEntity implements targetY = pos.y + shape.max(Direction.Axis.Y); } else if (res.getType() == HitResult.Type.BLOCK && this.level().noCollision(new AABB(pos, pos))) { targetY = res.getLocation().y; + } else { + targetY = pos.y - maxLength; } double diffY = targetY - pos.y; diff --git a/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java b/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java index abc93ac5b..e911fafc6 100644 --- a/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java @@ -915,16 +915,8 @@ public class ClientEventHandler { if (iVehicle instanceof PrismTankEntity prismTank) { if (prismTank.getWeaponIndex(0) == 0) { player.playSound(ModSounds.PRISM_FIRE_1P.get(), 1f, 1); - } else if (prismTank.getWeaponIndex(0) == 1) { - float pitch = prismTank.getEntityData().get(HEAT) <= 60 ? 1.1f : (float) (1.1f - 0.011 * Math.abs(60 - prismTank.getEntityData().get(HEAT))); - player.playSound(ModSounds.PRISM_FIRE_1P_2.get(), 1f, pitch); } } - - if (iVehicle instanceof Hpj11Entity hpj11Entity) { - float pitch = hpj11Entity.getEntityData().get(HEAT) <= 60 ? 1 : (float) (1 - 0.011 * Math.abs(60 - hpj11Entity.getEntityData().get(HEAT))); - player.playSound(ModSounds.HPJ_11_FIRE_1P.get(), 1f, (float) ((2 * org.joml.Math.random() - 1) * 0.05f + pitch)); - } } @SubscribeEvent diff --git a/src/main/java/com/atsuishio/superbwarfare/init/ModSounds.java b/src/main/java/com/atsuishio/superbwarfare/init/ModSounds.java index 5b604e387..03b987e98 100644 --- a/src/main/java/com/atsuishio/superbwarfare/init/ModSounds.java +++ b/src/main/java/com/atsuishio/superbwarfare/init/ModSounds.java @@ -439,7 +439,6 @@ public class ModSounds { public static final DeferredHolder INSIDIOUS_VERYFAR = REGISTRY.register("insidious_veryfar", () -> SoundEvent.createVariableRangeEvent(Mod.loc("insidious_veryfar"))); public static final DeferredHolder INSIDIOUS_RELOAD_EMPTY = REGISTRY.register("insidious_reload_empty", () -> SoundEvent.createVariableRangeEvent(Mod.loc("insidious_reload_empty"))); public static final DeferredHolder SMOKE_FIRE = REGISTRY.register("smoke_fire", () -> SoundEvent.createVariableRangeEvent(Mod.loc("smoke_fire"))); - public static final DeferredHolder HPJ_11_FIRE_1P = REGISTRY.register("hpj_11_fire_1p", () -> SoundEvent.createVariableRangeEvent(Mod.loc("hpj_11_fire_1p"))); public static final DeferredHolder HPJ_11_FIRE_3P = REGISTRY.register("hpj_11_fire_3p", () -> SoundEvent.createVariableRangeEvent(Mod.loc("hpj_11_fire_3p"))); } diff --git a/src/main/resources/assets/superbwarfare/geo/prism_tank.geo.json b/src/main/resources/assets/superbwarfare/geo/prism_tank.geo.json index 1cd9a195e..63f912f3e 100644 --- a/src/main/resources/assets/superbwarfare/geo/prism_tank.geo.json +++ b/src/main/resources/assets/superbwarfare/geo/prism_tank.geo.json @@ -1189,77 +1189,6 @@ "parent": "cannon", "pivot": [0, 58, -8] }, - { - "name": "laser", - "parent": "barrel", - "pivot": [0, 62.5018, -8], - "cubes": [ - { - "origin": [-1.68, 56.31904, -9.6], - "size": [3.36, 12.36, 1.6], - "uv": { - "north": {"uv": [51, 88], "uv_size": [1, 1]}, - "east": {"uv": [51, 88], "uv_size": [1, 1]}, - "south": {"uv": [51, 88], "uv_size": [1, 1]}, - "west": {"uv": [51, 88], "uv_size": [1, 1]}, - "up": {"uv": [52, 89], "uv_size": [-1, -1]}, - "down": {"uv": [52, 89], "uv_size": [-1, -1]} - } - }, - { - "origin": [-2.52, 55.47848, -9.6], - "size": [5.04, 0, 1.6], - "uv": { - "up": {"uv": [53, 89], "uv_size": [-1, -1]} - } - }, - { - "origin": [-11.52168, 55.48016, -9.6], - "size": [14.04, 0, 1.6], - "pivot": [0, 58.00016, -14.72], - "rotation": [0, 0, 90], - "uv": { - "up": {"uv": [53, 89], "uv_size": [-1, -1]} - } - }, - { - "origin": [-2.52, 64.47848, -9.6], - "size": [5.04, 0, 1.6], - "pivot": [0, 67.00016, -14.72], - "rotation": [0, 0, -180], - "uv": { - "up": {"uv": [53, 89], "uv_size": [-1, -1]} - } - }, - { - "origin": [-2.52168, 55.48016, -9.6], - "size": [14.04, 0, 1.6], - "pivot": [0, 58.00016, -14.72], - "rotation": [0, 0, -90], - "uv": { - "up": {"uv": [53, 89], "uv_size": [-1, -1]} - } - }, - { - "origin": [-7.02, 62.50184, -10.52], - "size": [14.04, 0, 5.04], - "pivot": [0, 62.50184, -8], - "rotation": [90, 0, -90], - "uv": { - "up": {"uv": [53, 89], "uv_size": [-1, -1]} - } - }, - { - "origin": [-2.52, 57.99848, -12.121], - "size": [14.04, 0, 5.04], - "pivot": [0, 57.99848, -9.601], - "rotation": [-90, 0, -90], - "uv": { - "up": {"uv": [53, 89], "uv_size": [-1, -1]} - } - } - ] - }, { "name": "head", "parent": "barrel", @@ -10739,6 +10668,91 @@ } } ] + }, + { + "name": "cannon2", + "pivot": [0, 34.3, -11.8] + }, + { + "name": "barrel2", + "parent": "cannon2", + "pivot": [0, 58, -8] + }, + { + "name": "head2", + "parent": "barrel2", + "pivot": [0, 62.5018, -8] + }, + { + "name": "laser", + "parent": "head2", + "pivot": [0, 62.5018, -8], + "cubes": [ + { + "origin": [-1.68, 56.31904, -9.6], + "size": [3.36, 12.36, 1.6], + "uv": { + "north": {"uv": [51, 88], "uv_size": [1, 1]}, + "east": {"uv": [51, 88], "uv_size": [1, 1]}, + "south": {"uv": [51, 88], "uv_size": [1, 1]}, + "west": {"uv": [51, 88], "uv_size": [1, 1]}, + "up": {"uv": [52, 89], "uv_size": [-1, -1]}, + "down": {"uv": [52, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [-2.52, 55.47848, -9.6], + "size": [5.04, 0, 1.6], + "uv": { + "up": {"uv": [53, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [-11.52168, 55.48016, -9.6], + "size": [14.04, 0, 1.6], + "pivot": [0, 58.00016, -14.72], + "rotation": [0, 0, 90], + "uv": { + "up": {"uv": [53, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [-2.52, 64.47848, -9.6], + "size": [5.04, 0, 1.6], + "pivot": [0, 67.00016, -14.72], + "rotation": [0, 0, -180], + "uv": { + "up": {"uv": [53, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [-2.52168, 55.48016, -9.6], + "size": [14.04, 0, 1.6], + "pivot": [0, 58.00016, -14.72], + "rotation": [0, 0, -90], + "uv": { + "up": {"uv": [53, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [-7.02, 62.50184, -10.52], + "size": [14.04, 0, 5.04], + "pivot": [0, 62.50184, -8], + "rotation": [90, 0, -90], + "uv": { + "up": {"uv": [53, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [-2.52, 57.99848, -12.121], + "size": [14.04, 0, 5.04], + "pivot": [0, 57.99848, -9.601], + "rotation": [-90, 0, -90], + "uv": { + "up": {"uv": [53, 89], "uv_size": [-1, -1]} + } + } + ] } ] } diff --git a/src/main/resources/assets/superbwarfare/sounds.json b/src/main/resources/assets/superbwarfare/sounds.json index 37080e275..c22f0391e 100644 --- a/src/main/resources/assets/superbwarfare/sounds.json +++ b/src/main/resources/assets/superbwarfare/sounds.json @@ -3044,14 +3044,6 @@ } ] }, - "hpj_11_fire_1p": { - "sounds": [ - { - "name": "superbwarfare:hpj11/hpj_11_fire_1p", - "stream": false - } - ] - }, "hpj_11_fire_3p": { "sounds": [ { diff --git a/src/main/resources/assets/superbwarfare/sounds/hpj11/hpj_11_fire_1p.ogg b/src/main/resources/assets/superbwarfare/sounds/hpj11/hpj_11_fire_1p.ogg deleted file mode 100644 index 19374402415e0ed5f1495c403a91aecb45071b2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8485 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