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 193744024..000000000 Binary files a/src/main/resources/assets/superbwarfare/sounds/hpj11/hpj_11_fire_1p.ogg and /dev/null differ