From ba9cde80e180f45409123b490614aa6886f56c80 Mon Sep 17 00:00:00 2001 From: Atsuishio <842960157@qq.com> Date: Mon, 28 Apr 2025 03:30:43 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=901130?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2e07f3c482445536d45c00e6abf223465c01c841 | 3 +- .../59eb3dbb5f86130e09b3c62d89b9525ee01cf52d | 6 +- .../b69ee8a2655365569b979911c0440daa8c470ac2 | 3 +- .../models/item/hpj_11_blueprint.json | 6 + .../loot_table/chests/blue_print_epic.json | 5 + .../loot_table/chests/blue_print_rare.json | 5 + .../superbwarfare/tags/item/revolver.json | 5 - .../projectile/SmallCannonShellLayer.java | 2 +- .../client/layer/vehicle/Hpj11HeatLayer.java | 34 +++++ .../client/layer/vehicle/Hpj11Layer.java | 29 ++++ .../model/entity/SmallCannonShellModel.java | 10 +- .../client/overlay/CannonHudOverlay.java | 37 +++-- .../client/renderer/entity/Hpj11Renderer.java | 14 +- .../entity/SmallCannonShellRenderer.java | 25 ++-- .../config/server/VehicleConfig.java | 20 +++ .../datagen/ModCustomLootProvider.java | 2 + .../datagen/ModItemModelProvider.java | 1 + .../entity/vehicle/Hpj11Entity.java | 127 ++++++++---------- .../vehicle/base/MobileVehicleEntity.java | 23 +--- .../entity/vehicle/base/VehicleEntity.java | 18 ++- .../event/ClientEventHandler.java | 5 + .../superbwarfare/init/ModEntities.java | 28 ++-- .../superbwarfare/init/ModItems.java | 1 + .../superbwarfare/init/ModSounds.java | 3 +- .../assets/superbwarfare/geo/1130.geo.json | 83 +++++++++++- .../geo/small_cannon_shell.geo.json | 37 +++++ .../assets/superbwarfare/lang/en_us.json | 1 + .../assets/superbwarfare/lang/zh_cn.json | 1 + .../assets/superbwarfare/sounds.json | 16 +++ .../sounds/hpj11/hpj_11_fire_1p.ogg | Bin 0 -> 8485 bytes .../sounds/hpj11/hpj_11_fire_3p.ogg | Bin 0 -> 6855 bytes .../superbwarfare/textures/entity/1130.png | Bin 5794 -> 5812 bytes .../superbwarfare/textures/entity/1130_e.png | Bin 0 -> 2092 bytes .../textures/entity/1130_heat.png | Bin 0 -> 1375 bytes .../textures/entity/small_cannon_shell.png | Bin 0 -> 110 bytes .../textures/screens/cannon/hpj_crosshair.png | Bin 0 -> 1480 bytes .../screens/cannon/hpj_crosshair_notzoom.png | Bin 0 -> 1267 bytes .../textures/vehicle_icon/hpj_11.png | Bin 0 -> 1460 bytes .../recipe/hpj_11_blueprint_crafting.json | 24 ++++ .../superbwarfare/recipe/hpj_11_smithing.json | 21 +++ 40 files changed, 442 insertions(+), 153 deletions(-) create mode 100644 src/generated/resources/assets/superbwarfare/models/item/hpj_11_blueprint.json delete mode 100644 src/generated/resources/data/superbwarfare/tags/item/revolver.json create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/layer/vehicle/Hpj11HeatLayer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/layer/vehicle/Hpj11Layer.java create mode 100644 src/main/resources/assets/superbwarfare/geo/small_cannon_shell.geo.json create mode 100644 src/main/resources/assets/superbwarfare/sounds/hpj11/hpj_11_fire_1p.ogg create mode 100644 src/main/resources/assets/superbwarfare/sounds/hpj11/hpj_11_fire_3p.ogg create mode 100644 src/main/resources/assets/superbwarfare/textures/entity/1130_e.png create mode 100644 src/main/resources/assets/superbwarfare/textures/entity/1130_heat.png create mode 100644 src/main/resources/assets/superbwarfare/textures/entity/small_cannon_shell.png create mode 100644 src/main/resources/assets/superbwarfare/textures/screens/cannon/hpj_crosshair.png create mode 100644 src/main/resources/assets/superbwarfare/textures/screens/cannon/hpj_crosshair_notzoom.png create mode 100644 src/main/resources/assets/superbwarfare/textures/vehicle_icon/hpj_11.png create mode 100644 src/main/resources/data/superbwarfare/recipe/hpj_11_blueprint_crafting.json create mode 100644 src/main/resources/data/superbwarfare/recipe/hpj_11_smithing.json diff --git a/src/generated/resources/.cache/2e07f3c482445536d45c00e6abf223465c01c841 b/src/generated/resources/.cache/2e07f3c482445536d45c00e6abf223465c01c841 index 64e990be4..95d737710 100644 --- a/src/generated/resources/.cache/2e07f3c482445536d45c00e6abf223465c01c841 +++ b/src/generated/resources/.cache/2e07f3c482445536d45c00e6abf223465c01c841 @@ -1,4 +1,4 @@ -// 1.21.1 2025-04-21T19:07:09.7051757 Tags for minecraft:item mod id superbwarfare +// 1.21.1 2025-04-28T03:55:32.0571362 Tags for minecraft:item mod id superbwarfare 44a232152f5941d0435a35483b37f8ed22fd10bf data/c/tags/item/dusts.json 0fa06c2ff83bf09797e3ddff90f62d1124e645b4 data/c/tags/item/dusts/coal_coke.json 295ddf906b7133a0558d03e9a60eea18281fe430 data/c/tags/item/dusts/iron.json @@ -42,7 +42,6 @@ ab580f3989177c0589c43ca346db571011600187 data/superbwarfare/tags/item/launcher/g b404c6fd99d2ca68c6738f225cb7d68ee443c10a data/superbwarfare/tags/item/machine_gun.json a53020091752016da6602ee1b8b7e08823614344 data/superbwarfare/tags/item/military_armor.json 8ea4fb7d3981141a953bd5510e8c76fb790307aa data/superbwarfare/tags/item/normal_gun.json -15328cd564c931cc0a4fc000596240f93a7b29a1 data/superbwarfare/tags/item/revolver.json aaa533157491a82b8e23b2914deef67c4078cbed data/superbwarfare/tags/item/rifle.json a249d9d052cdc24b34e0e51ab991329f6c76e8ab data/superbwarfare/tags/item/shotgun.json 4aca0fa3f8b9f2a4920041e35e46dae7e93d5482 data/superbwarfare/tags/item/smg.json diff --git a/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d b/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d index b55798a76..9fddc5eeb 100644 --- a/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d +++ b/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d @@ -1,4 +1,4 @@ -// 1.21.1 2025-04-08T22:45:20.96671 Loot Tables +// 1.21.1 2025-04-28T03:55:32.0605798 Loot Tables 98386b2e65b2afb7cf5b0cabf6a7b0f062c1e640 data/superbwarfare/loot_table/blocks/barbed_wire.json 811e69929a14e6736015849c220100bb58d914c9 data/superbwarfare/loot_table/blocks/cemented_carbide_block.json 1f482bc1f0a1026d0e1b75ee28c6f541b56747a5 data/superbwarfare/loot_table/blocks/charging_station.json @@ -22,8 +22,8 @@ fb31a40f6a04000f317823cbb80eda8588ba9c69 data/superbwarfare/loot_table/blocks/si 71fc892124b5343e10688cabc2fb7c87d83cfef8 data/superbwarfare/loot_table/blocks/tungsten_block.json 6e2346c664cd643bff31c0a26e463c6c8dd46e37 data/superbwarfare/loot_table/chests/ancient_cpu.json 031ebfa016c816ebbd03dcf03f169599eed3e9d4 data/superbwarfare/loot_table/chests/blue_print_common.json -eef164cceb825ad572fc9d2eaef4631f9ec13c7f data/superbwarfare/loot_table/chests/blue_print_epic.json -f28f40e6bca3090625550f4c62d5f2a1384fe3ba data/superbwarfare/loot_table/chests/blue_print_rare.json +60f0cf8c558f09fd878a68e0c3a876c9484f83ac data/superbwarfare/loot_table/chests/blue_print_epic.json +dd6ba01de4126332ac0dda484ab4176c03fdad06 data/superbwarfare/loot_table/chests/blue_print_rare.json 7e75ff103ccdbcf6be6f61413a4173115195f0a9 data/superbwarfare/loot_table/containers/blueprints.json be87d07ea13253e7a2237f048acc655e16e8317c data/superbwarfare/loot_table/containers/common.json 151368546abc7b65138a0a822dd53b48999d86be data/superbwarfare/loot_table/special/common/blueprints.json diff --git a/src/generated/resources/.cache/b69ee8a2655365569b979911c0440daa8c470ac2 b/src/generated/resources/.cache/b69ee8a2655365569b979911c0440daa8c470ac2 index f1d1cdcc2..b56d0196e 100644 --- a/src/generated/resources/.cache/b69ee8a2655365569b979911c0440daa8c470ac2 +++ b/src/generated/resources/.cache/b69ee8a2655365569b979911c0440daa8c470ac2 @@ -1,4 +1,4 @@ -// 1.21.1 2025-04-08T06:51:00.2717304 Item Models: superbwarfare +// 1.21.1 2025-04-28T03:55:32.0625325 Item Models: superbwarfare 13ca8d5676888ff51f3308d88e4bf67691fa34f8 assets/superbwarfare/models/item/aa_12_blueprint.json 13ca8d5676888ff51f3308d88e4bf67691fa34f8 assets/superbwarfare/models/item/ak_12_blueprint.json 13ca8d5676888ff51f3308d88e4bf67691fa34f8 assets/superbwarfare/models/item/ak_47_blueprint.json @@ -40,6 +40,7 @@ afbfd24461fb7e6b43a8e029f0a894b84d8b6638 assets/superbwarfare/models/item/heavy_ e7a6de100f377835831211168d98c8d19434af24 assets/superbwarfare/models/item/he_head.json d23520b099cb796401635fe75b5b852fc957d4ea assets/superbwarfare/models/item/high_energy_explosives.json 13ca8d5676888ff51f3308d88e4bf67691fa34f8 assets/superbwarfare/models/item/hk_416_blueprint.json +a5cf666a970906ba6ac0af9a4d5d52dd0e093dec assets/superbwarfare/models/item/hpj_11_blueprint.json 13ca8d5676888ff51f3308d88e4bf67691fa34f8 assets/superbwarfare/models/item/hunting_rifle_blueprint.json 13ca8d5676888ff51f3308d88e4bf67691fa34f8 assets/superbwarfare/models/item/insidious_blueprint.json 3c9dcc3393e16ca354b01162316f1ddae92338ec assets/superbwarfare/models/item/iron_action.json diff --git a/src/generated/resources/assets/superbwarfare/models/item/hpj_11_blueprint.json b/src/generated/resources/assets/superbwarfare/models/item/hpj_11_blueprint.json new file mode 100644 index 000000000..c698e5dfc --- /dev/null +++ b/src/generated/resources/assets/superbwarfare/models/item/hpj_11_blueprint.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "superbwarfare:item/cannon_blueprint" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/superbwarfare/loot_table/chests/blue_print_epic.json b/src/generated/resources/data/superbwarfare/loot_table/chests/blue_print_epic.json index 0b9db152a..fdad040ec 100644 --- a/src/generated/resources/data/superbwarfare/loot_table/chests/blue_print_epic.json +++ b/src/generated/resources/data/superbwarfare/loot_table/chests/blue_print_epic.json @@ -99,6 +99,11 @@ "name": "superbwarfare:mle_1934_blueprint", "weight": 10 }, + { + "type": "minecraft:item", + "name": "superbwarfare:hpj_11_blueprint", + "weight": 10 + }, { "type": "minecraft:item", "name": "superbwarfare:annihilator_blueprint", diff --git a/src/generated/resources/data/superbwarfare/loot_table/chests/blue_print_rare.json b/src/generated/resources/data/superbwarfare/loot_table/chests/blue_print_rare.json index a2a4f043a..33730a630 100644 --- a/src/generated/resources/data/superbwarfare/loot_table/chests/blue_print_rare.json +++ b/src/generated/resources/data/superbwarfare/loot_table/chests/blue_print_rare.json @@ -189,6 +189,11 @@ "name": "superbwarfare:mle_1934_blueprint", "weight": 3 }, + { + "type": "minecraft:item", + "name": "superbwarfare:hpj_11_blueprint", + "weight": 3 + }, { "type": "minecraft:item", "name": "superbwarfare:annihilator_blueprint" diff --git a/src/generated/resources/data/superbwarfare/tags/item/revolver.json b/src/generated/resources/data/superbwarfare/tags/item/revolver.json deleted file mode 100644 index 42c48202c..000000000 --- a/src/generated/resources/data/superbwarfare/tags/item/revolver.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "values": [ - "superbwarfare:trachelium" - ] -} \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/client/layer/projectile/SmallCannonShellLayer.java b/src/main/java/com/atsuishio/superbwarfare/client/layer/projectile/SmallCannonShellLayer.java index a6e74988f..d416d7e5a 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/layer/projectile/SmallCannonShellLayer.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/layer/projectile/SmallCannonShellLayer.java @@ -13,7 +13,7 @@ import software.bernie.geckolib.renderer.GeoRenderer; import software.bernie.geckolib.renderer.layer.GeoRenderLayer; public class SmallCannonShellLayer extends GeoRenderLayer { - private static final ResourceLocation LAYER = Mod.loc("textures/entity/cannon_shell_e.png"); + private static final ResourceLocation LAYER = Mod.loc("textures/entity/small_cannon_shell.png"); public SmallCannonShellLayer(GeoRenderer entityRenderer) { super(entityRenderer); diff --git a/src/main/java/com/atsuishio/superbwarfare/client/layer/vehicle/Hpj11HeatLayer.java b/src/main/java/com/atsuishio/superbwarfare/client/layer/vehicle/Hpj11HeatLayer.java new file mode 100644 index 000000000..10b4007ac --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/layer/vehicle/Hpj11HeatLayer.java @@ -0,0 +1,34 @@ +package com.atsuishio.superbwarfare.client.layer.vehicle; + +import com.atsuishio.superbwarfare.Mod; +import com.atsuishio.superbwarfare.entity.vehicle.Hpj11Entity; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.FastColor; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoRenderer; +import software.bernie.geckolib.renderer.layer.GeoRenderLayer; + +import static com.atsuishio.superbwarfare.entity.vehicle.Hpj11Entity.HEAT; + +public class Hpj11HeatLayer extends GeoRenderLayer { + private static final ResourceLocation LAYER = Mod.loc("textures/entity/1130_heat.png"); + + public Hpj11HeatLayer(GeoRenderer entityRenderer) { + super(entityRenderer); + } + + @Override + public void render(PoseStack poseStack, Hpj11Entity animatable, BakedGeoModel bakedModel, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay) { + RenderType glowRenderType = RenderType.eyes(LAYER); + float heat = animatable.getEntityData().get(HEAT) < 20 ? 0 : animatable.getEntityData().get(HEAT) - 20; + var value = (int) (heat / 80f * 255); + var color = FastColor.ARGB32.color(value, value, value); + getRenderer().reRender(getDefaultBakedModel(animatable), poseStack, bufferSource, animatable, glowRenderType, bufferSource.getBuffer(glowRenderType), partialTick, packedLight, OverlayTexture.NO_OVERLAY, color); + } +} + diff --git a/src/main/java/com/atsuishio/superbwarfare/client/layer/vehicle/Hpj11Layer.java b/src/main/java/com/atsuishio/superbwarfare/client/layer/vehicle/Hpj11Layer.java new file mode 100644 index 000000000..312a0de0a --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/layer/vehicle/Hpj11Layer.java @@ -0,0 +1,29 @@ +package com.atsuishio.superbwarfare.client.layer.vehicle; + +import com.atsuishio.superbwarfare.Mod; +import com.atsuishio.superbwarfare.client.ModRenderTypes; +import com.atsuishio.superbwarfare.entity.vehicle.Hpj11Entity; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoRenderer; +import software.bernie.geckolib.renderer.layer.GeoRenderLayer; + +public class Hpj11Layer extends GeoRenderLayer { + + private static final ResourceLocation LAYER = Mod.loc("textures/entity/1130_e.png"); + + public Hpj11Layer(GeoRenderer entityRenderer) { + super(entityRenderer); + } + + @Override + public void render(PoseStack poseStack, Hpj11Entity animatable, BakedGeoModel bakedModel, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay) { + RenderType glowRenderType = ModRenderTypes.MUZZLE_FLASH_TYPE.apply(LAYER); + getRenderer().reRender(getDefaultBakedModel(animatable), poseStack, bufferSource, animatable, glowRenderType, bufferSource.getBuffer(glowRenderType), partialTick, packedLight, OverlayTexture.NO_OVERLAY, 0xFFFFFFFF); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/entity/SmallCannonShellModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/entity/SmallCannonShellModel.java index f045676b5..73e6418a6 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/model/entity/SmallCannonShellModel.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/entity/SmallCannonShellModel.java @@ -11,24 +11,22 @@ public class SmallCannonShellModel extends GeoModel { @Override public ResourceLocation getAnimationResource(SmallCannonShellEntity entity) { - return Mod.loc("animations/cannon_shell.animation.json"); + return null; } @Override public ResourceLocation getModelResource(SmallCannonShellEntity entity) { - return Mod.loc("geo/cannon_shell.geo.json"); + return Mod.loc("geo/small_cannon_shell.geo.json"); } @Override public ResourceLocation getTextureResource(SmallCannonShellEntity entity) { - return Mod.loc("textures/entity/cannon_shell.png"); + return Mod.loc("textures/entity/small_cannon_shell.png"); } @Override public void setCustomAnimations(SmallCannonShellEntity animatable, long instanceId, AnimationState animationState) { GeoBone bone = getAnimationProcessor().getBone("bone"); - bone.setScaleX(0.17f); - bone.setScaleY(0.17f); - bone.setScaleZ(0.17f); + bone.setScaleY((float) (1 + animatable.getDeltaMovement().length())); } } diff --git a/src/main/java/com/atsuishio/superbwarfare/client/overlay/CannonHudOverlay.java b/src/main/java/com/atsuishio/superbwarfare/client/overlay/CannonHudOverlay.java index 1aacc6a4d..33293b42f 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/overlay/CannonHudOverlay.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/overlay/CannonHudOverlay.java @@ -3,6 +3,7 @@ package com.atsuishio.superbwarfare.client.overlay; import com.atsuishio.superbwarfare.Mod; import com.atsuishio.superbwarfare.client.RenderHelper; import com.atsuishio.superbwarfare.entity.vehicle.AnnihilatorEntity; +import com.atsuishio.superbwarfare.entity.vehicle.Hpj11Entity; import com.atsuishio.superbwarfare.entity.vehicle.Mk42Entity; import com.atsuishio.superbwarfare.entity.vehicle.Mle1934Entity; import com.atsuishio.superbwarfare.entity.vehicle.base.CannonEntity; @@ -134,17 +135,37 @@ public class CannonHudOverlay implements LayeredDraw.Layer { w / 2 + 14, h / 2 - 20, -1, false); } } - if (cannon instanceof AnnihilatorEntity) { - preciseBlit(guiGraphics, Mod.loc("textures/screens/cannon/laser_cannon_crosshair.png"), k, l, 0, 0.0F, i, j, i, j); - } else { - preciseBlit(guiGraphics, Mod.loc("textures/screens/cannon/cannon_crosshair.png"), k, l, 0, 0.0F, i, j, i, j); - } - float diffY = -Mth.wrapDegrees(Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), player.yHeadRotO, player.getYHeadRot()) - Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), cannon.yRotO, cannon.getYRot())); - preciseBlit(guiGraphics, Mod.loc("textures/screens/cannon/indicator.png"), (float) w / 2 - 4.3f + 0.45f * diffY, (float) h / 2 - 10, 0, 0.0F, 8, 8, 8, 8); + if (!(cannon instanceof Hpj11Entity)) { + if (cannon instanceof AnnihilatorEntity) { + preciseBlit(guiGraphics, Mod.loc("textures/screens/cannon/laser_cannon_crosshair.png"), k, l, 0, 0.0F, i, j, i, j); + } else { + preciseBlit(guiGraphics, Mod.loc("textures/screens/cannon/cannon_crosshair.png"), k, l, 0, 0.0F, i, j, i, j); + } + float diffY = -Mth.wrapDegrees(Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), player.yHeadRotO, player.getYHeadRot()) - Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), cannon.yRotO, cannon.getYRot())); + + preciseBlit(guiGraphics, Mod.loc("textures/screens/cannon/indicator.png"), (float) w / 2 - 4.3f + 0.45f * diffY, (float) h / 2 - 10, 0, 0.0F, 8, 8, 8, 8); + } else { + preciseBlit(guiGraphics, Mod.loc("textures/screens/cannon/hpj_crosshair.png"), k, l, 0, 0.0F, i, j, i, j); + } + + } else { - preciseBlit(guiGraphics, Mod.loc("textures/screens/cannon/cannon_crosshair_notzoom.png"), k, l, 0, 0.0F, i, j, i, j); + if (!(cannon instanceof Hpj11Entity)) { + preciseBlit(guiGraphics, Mod.loc("textures/screens/cannon/cannon_crosshair_notzoom.png"), k, l, 0, 0.0F, i, j, i, j); + } else { + preciseBlit(guiGraphics, Mod.loc("textures/screens/cannon/hpj_crosshair_notzoom.png"), k, l, 0, 0.0F, i, j, i, j); + } + } + + RenderSystem.disableDepthTest(); + RenderSystem.depthMask(false); + RenderSystem.enableBlend(); + RenderSystem.setShader(GameRenderer::getPositionTexShader); + RenderSystem.blendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO); + RenderSystem.setShaderColor(1, 1, 1, 1); + renderKillIndicator(guiGraphics, w, h); } else if (Minecraft.getInstance().options.getCameraType() == CameraType.THIRD_PERSON_BACK && !ClientEventHandler.zoomVehicle) { Vec3 p = RenderHelper.worldToScreen(new Vec3(Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), player.xo, player.getX()), Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), player.yo, player.getY()), diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/entity/Hpj11Renderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/entity/Hpj11Renderer.java index 5dd6bd5a3..368aa14de 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/renderer/entity/Hpj11Renderer.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/entity/Hpj11Renderer.java @@ -1,5 +1,7 @@ package com.atsuishio.superbwarfare.client.renderer.entity; +import com.atsuishio.superbwarfare.client.layer.vehicle.Hpj11HeatLayer; +import com.atsuishio.superbwarfare.client.layer.vehicle.Hpj11Layer; import com.atsuishio.superbwarfare.client.model.entity.Hpj11Model; import com.atsuishio.superbwarfare.entity.vehicle.Hpj11Entity; import com.atsuishio.superbwarfare.event.ClientEventHandler; @@ -19,12 +21,15 @@ import software.bernie.geckolib.cache.object.BakedGeoModel; import software.bernie.geckolib.cache.object.GeoBone; import software.bernie.geckolib.renderer.GeoEntityRenderer; +import static com.atsuishio.superbwarfare.entity.vehicle.Hpj11Entity.ANIM_TIME; + public class Hpj11Renderer extends GeoEntityRenderer { public Hpj11Renderer(EntityRendererProvider.Context renderManager) { super(renderManager, new Hpj11Model()); this.shadowRadius = 1.5f; -// this.addRenderLayer(new Mk42Layer(this)); + this.addRenderLayer(new Hpj11Layer(this)); + this.addRenderLayer(new Hpj11HeatLayer(this)); } @Override @@ -70,6 +75,13 @@ public class Hpj11Renderer extends GeoEntityRenderer { bone.setRotZ(-Mth.lerp(partialTick, animatable.gunRotO, animatable.getGunRot())); } + if (name.equals("flare")) { + bone.setHidden(animatable.getEntityData().get(ANIM_TIME) == 0); + bone.setScaleX((float) (2 + 0.8 * (Math.random() - 0.5))); + bone.setScaleY((float) (2 + 0.8 * (Math.random() - 0.5))); + bone.setRotZ((float) (0.5 * (Math.random() - 0.5))); + } + super.renderRecursively(poseStack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, color); } } diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/entity/SmallCannonShellRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/entity/SmallCannonShellRenderer.java index 11a624b60..dbc4e4f4a 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/renderer/entity/SmallCannonShellRenderer.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/entity/SmallCannonShellRenderer.java @@ -11,6 +11,7 @@ import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; +import org.jetbrains.annotations.NotNull; import software.bernie.geckolib.cache.object.BakedGeoModel; import software.bernie.geckolib.renderer.GeoEntityRenderer; @@ -27,18 +28,22 @@ public class SmallCannonShellRenderer extends GeoEntityRenderer 0) { + float scale = 1f; + this.scaleHeight = scale; + this.scaleWidth = scale; + super.preRender(poseStack, entity, model, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, color); + } } @Override - public void render(SmallCannonShellEntity entityIn, float entityYaw, float partialTicks, PoseStack poseStack, MultiBufferSource bufferIn, int packedLightIn) { - poseStack.pushPose(); - poseStack.mulPose(Axis.YP.rotationDegrees(Mth.lerp(partialTicks, entityIn.yRotO, entityIn.getYRot()) - 90)); - poseStack.mulPose(Axis.ZP.rotationDegrees(90 + Mth.lerp(partialTicks, entityIn.xRotO, entityIn.getXRot()))); - super.render(entityIn, entityYaw, partialTicks, poseStack, bufferIn, packedLightIn); - poseStack.popPose(); + public void render(SmallCannonShellEntity entityIn, float entityYaw, float partialTicks, @NotNull PoseStack poseStack, @NotNull MultiBufferSource bufferIn, int packedLightIn) { + if (entityIn.tickCount > 0) { + poseStack.pushPose(); + poseStack.mulPose(Axis.YP.rotationDegrees(Mth.lerp(partialTicks, entityIn.yRotO, entityIn.getYRot()) - 90)); + poseStack.mulPose(Axis.ZP.rotationDegrees(90 + Mth.lerp(partialTicks, entityIn.xRotO, entityIn.getXRot()))); + super.render(entityIn, entityYaw, partialTicks, poseStack, bufferIn, packedLightIn); + poseStack.popPose(); + } } } diff --git a/src/main/java/com/atsuishio/superbwarfare/config/server/VehicleConfig.java b/src/main/java/com/atsuishio/superbwarfare/config/server/VehicleConfig.java index 6a76a4df6..608d229c9 100644 --- a/src/main/java/com/atsuishio/superbwarfare/config/server/VehicleConfig.java +++ b/src/main/java/com/atsuishio/superbwarfare/config/server/VehicleConfig.java @@ -107,6 +107,11 @@ public class VehicleConfig { public static ModConfigSpec.IntValue PRISM_TANK_DAMAGE_MODE_2; public static ModConfigSpec.IntValue PRISM_TANK_SHOOT_COST_MODE_2; + public static ModConfigSpec.IntValue HPJ11_HP; + public static ModConfigSpec.DoubleValue HPJ11_DAMAGE; + public static ModConfigSpec.DoubleValue HPJ11_EXPLOSION_DAMAGE; + public static ModConfigSpec.DoubleValue HPJ11_EXPLOSION_RADIUS; + public static void init(ModConfigSpec.Builder builder) { builder.push("vehicle"); @@ -415,6 +420,21 @@ public class VehicleConfig { builder.comment("The energy cost of PrismTank Mode 2 per tick"); PRISM_TANK_SHOOT_COST_MODE_2 = builder.defineInRange("prism_tank_shoot_cost_mode_2", 5000, 1, 10000000); + builder.pop(); + + builder.push("hpj_11"); + + builder.comment("The health of HPJ_11"); + HPJ11_HP = builder.defineInRange("hpj_11_hp", 350, 1, 10000000); + + builder.comment("The damage of HPJ_11"); + HPJ11_DAMAGE = builder.defineInRange("hpj_11_damage", 20d, 1, 10000000); + + builder.comment("The explosion damage of HPJ_11"); + HPJ11_EXPLOSION_DAMAGE = builder.defineInRange("hpj_11_explosion_damage", 7d, 1, 10000000); + + builder.comment("The explosion radius of HPJ_11"); + HPJ11_EXPLOSION_RADIUS = builder.defineInRange("hpj_11_explosion_radius", 4d, 1, 50); builder.pop(); diff --git a/src/main/java/com/atsuishio/superbwarfare/datagen/ModCustomLootProvider.java b/src/main/java/com/atsuishio/superbwarfare/datagen/ModCustomLootProvider.java index 96a4b3ae3..0f15ba81e 100644 --- a/src/main/java/com/atsuishio/superbwarfare/datagen/ModCustomLootProvider.java +++ b/src/main/java/com/atsuishio/superbwarfare/datagen/ModCustomLootProvider.java @@ -142,6 +142,7 @@ public class ModCustomLootProvider implements LootTableSubProvider { new ItemEntry(ModItems.SECONDARY_CATACLYSM_BLUEPRINT.get(), 3), new ItemEntry(ModItems.MK_42_BLUEPRINT.get(), 3), new ItemEntry(ModItems.MLE_1934_BLUEPRINT.get(), 3), + new ItemEntry(ModItems.HPJ_11_BLUEPRINT.get(), 3), new ItemEntry(ModItems.ANNIHILATOR_BLUEPRINT.get(), 1) )) .withPool(multiItems(2, 0, @@ -186,6 +187,7 @@ public class ModCustomLootProvider implements LootTableSubProvider { new ItemEntry(ModItems.SECONDARY_CATACLYSM_BLUEPRINT.get(), 15), new ItemEntry(ModItems.MK_42_BLUEPRINT.get(), 10), new ItemEntry(ModItems.MLE_1934_BLUEPRINT.get(), 10), + new ItemEntry(ModItems.HPJ_11_BLUEPRINT.get(), 10), new ItemEntry(ModItems.ANNIHILATOR_BLUEPRINT.get(), 5) )) .withPool(multiItems(2, 0, diff --git a/src/main/java/com/atsuishio/superbwarfare/datagen/ModItemModelProvider.java b/src/main/java/com/atsuishio/superbwarfare/datagen/ModItemModelProvider.java index 9072debbd..57ba5682a 100644 --- a/src/main/java/com/atsuishio/superbwarfare/datagen/ModItemModelProvider.java +++ b/src/main/java/com/atsuishio/superbwarfare/datagen/ModItemModelProvider.java @@ -152,6 +152,7 @@ public class ModItemModelProvider extends ItemModelProvider { cannonBlueprintItem(ModItems.MK_42_BLUEPRINT); cannonBlueprintItem(ModItems.MLE_1934_BLUEPRINT); cannonBlueprintItem(ModItems.ANNIHILATOR_BLUEPRINT); + cannonBlueprintItem(ModItems.HPJ_11_BLUEPRINT); gunBlueprintItem(ModItems.M_2_HB_BLUEPRINT); gunBlueprintItem(ModItems.SECONDARY_CATACLYSM_BLUEPRINT); gunBlueprintItem(ModItems.INSIDIOUS_BLUEPRINT); diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Hpj11Entity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Hpj11Entity.java index c9662c9b6..366c3e53e 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Hpj11Entity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Hpj11Entity.java @@ -17,7 +17,7 @@ import com.atsuishio.superbwarfare.init.ModTags; import com.atsuishio.superbwarfare.tools.CustomExplosion; import com.atsuishio.superbwarfare.tools.InventoryTool; import com.atsuishio.superbwarfare.tools.ParticleTool; -import com.atsuishio.superbwarfare.tools.SoundTool; +import com.mojang.math.Axis; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; @@ -46,7 +46,7 @@ import software.bernie.geckolib.animation.AnimatableManager; import software.bernie.geckolib.util.GeckoLibUtil; public class Hpj11Entity extends VehicleEntity implements GeoEntity, CannonEntity { - public static final EntityDataAccessor COOL_DOWN = SynchedEntityData.defineId(Hpj11Entity.class, EntityDataSerializers.INT); + public static final EntityDataAccessor ANIM_TIME = SynchedEntityData.defineId(Hpj11Entity.class, EntityDataSerializers.INT); public static final EntityDataAccessor GUN_ROTATE = SynchedEntityData.defineId(Hpj11Entity.class, EntityDataSerializers.FLOAT); private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); @@ -60,7 +60,7 @@ public class Hpj11Entity extends VehicleEntity implements GeoEntity, CannonEntit @Override protected void defineSynchedData(SynchedEntityData.Builder builder) { super.defineSynchedData(builder); - builder.define(COOL_DOWN, 0) + builder.define(ANIM_TIME, 0) .define(GUN_ROTATE, 0f); } @@ -69,9 +69,9 @@ public class Hpj11Entity extends VehicleEntity implements GeoEntity, CannonEntit return new VehicleWeapon[][]{ new VehicleWeapon[]{ new SmallCannonShellWeapon() - .damage(40) - .explosionDamage(8) - .explosionRadius(4f) + .damage(VehicleConfig.HPJ11_DAMAGE.get().floatValue()) + .explosionDamage(VehicleConfig.HPJ11_EXPLOSION_DAMAGE.get().floatValue()) + .explosionRadius(VehicleConfig.HPJ11_EXPLOSION_RADIUS.get().floatValue()) .icon(Mod.loc("textures/screens/vehicle_weapon/cannon_30mm.png")) } }; @@ -79,19 +79,19 @@ public class Hpj11Entity extends VehicleEntity implements GeoEntity, CannonEntit @Override public ThirdPersonCameraPosition getThirdPersonCameraPosition(int index) { - return new ThirdPersonCameraPosition(5, 0.25, 0); + return new ThirdPersonCameraPosition(2, 0.75, 0); } @Override public void addAdditionalSaveData(CompoundTag compound) { super.addAdditionalSaveData(compound); - compound.putInt("CoolDown", this.entityData.get(COOL_DOWN)); + compound.putInt("AnimTime", this.entityData.get(ANIM_TIME)); } @Override protected void readAdditionalSaveData(CompoundTag compound) { super.readAdditionalSaveData(compound); - this.entityData.set(COOL_DOWN, compound.getInt("CoolDown")); + this.entityData.set(ANIM_TIME, compound.getInt("AnimTime")); } @Override @@ -133,8 +133,8 @@ public class Hpj11Entity extends VehicleEntity implements GeoEntity, CannonEntit gunRotO = this.getGunRot(); super.baseTick(); - if (this.entityData.get(COOL_DOWN) > 0) { - this.entityData.set(COOL_DOWN, this.entityData.get(COOL_DOWN) - 1); + if (this.entityData.get(ANIM_TIME) > 0) { + this.entityData.set(ANIM_TIME, this.entityData.get(ANIM_TIME) - 1); } this.move(MoverType.SELF, this.getDeltaMovement()); @@ -147,10 +147,6 @@ public class Hpj11Entity extends VehicleEntity implements GeoEntity, CannonEntit this.entityData.set(GUN_ROTATE, this.entityData.get(GUN_ROTATE) * 0.8f); setGunRot(getGunRot() + entityData.get(GUN_ROTATE)); - if (level().isClientSide && (Math.abs(entityData.get(GUN_ROTATE)) > 0.02)) { - level().playLocalSound(this.getX(), this.getY() + this.getBbHeight() * 0.5, this.getZ(), ModSounds.TURRET_TURN.get(), this.getSoundSource(), (float) Math.min(0.2 * entityData.get(GUN_ROTATE), 1), (random.nextFloat() * 0.05f + 1), false); - } - lowHealthWarning(); } @@ -229,70 +225,53 @@ public class Hpj11Entity extends VehicleEntity implements GeoEntity, CannonEntit @Override public Vec3 driverZoomPos(float ticks) { - Matrix4f transform = getVehicleFlatTransform(ticks); - Vector4f worldPosition = transformPosition(transform, 0f, 1.5f, 0.25f); + Matrix4f transform = getBarrelTransform(ticks); + Vector4f worldPosition = transformPosition(transform, 0f, 1f, 0); return new Vec3(worldPosition.x, worldPosition.y, worldPosition.z); } @Override public void vehicleShoot(Player player, int type) { -// if (this.entityData.get(COOL_DOWN) > 0) return; + if (cannotFire) return; - Level level = player.level(); - if (level instanceof ServerLevel) { - if (!InventoryTool.hasCreativeAmmoBox(player)) { - var ammo = ModItems.SMALL_SHELL.get(); - var ammoCount = InventoryTool.countItem(player.getInventory().items, ammo); + if (!InventoryTool.hasCreativeAmmoBox(player)) { + var ammo = ModItems.SMALL_SHELL.get(); + var ammoCount = InventoryTool.countItem(player.getInventory().items, ammo); - if (ammoCount <= 0) return; - InventoryTool.consumeItem(player.getInventory().items, ammo, 1); - } - - var entityToSpawn = ((SmallCannonShellWeapon) getWeapon(0)).create(player); - - Matrix4f transform = getVehicleFlatTransform(1); - Vector4f worldPosition = transformPosition(transform, 0f, 1.375f, 0.25f); - - entityToSpawn.setPos(worldPosition.x, worldPosition.y, worldPosition.z); - entityToSpawn.shoot(getLookAngle().x, getLookAngle().y, getLookAngle().z, 30, 0.3f); - level.addFreshEntity(entityToSpawn); - - if (player instanceof ServerPlayer serverPlayer) { - SoundTool.playLocalSound(serverPlayer, ModSounds.MINIGUN_FIRE_1P.get(), 2, 1); - serverPlayer.level().playSound(null, serverPlayer.getOnPos(), ModSounds.MINIGUN_FIRE_3P.get(), SoundSource.PLAYERS, 6, 1); - serverPlayer.level().playSound(null, serverPlayer.getOnPos(), ModSounds.MINIGUN_FAR.get(), SoundSource.PLAYERS, 16, 1); - serverPlayer.level().playSound(null, serverPlayer.getOnPos(), ModSounds.MINIGUN_VERYFAR.get(), SoundSource.PLAYERS, 32, 1); - } - - this.entityData.set(GUN_ROTATE, entityData.get(GUN_ROTATE) + 0.5f); - -// this.entityData.set(COOL_DOWN, 30); - -// server.sendParticles(ParticleTypes.CAMPFIRE_COSY_SMOKE, -// this.getX() + 5 * this.getLookAngle().x, -// this.getY(), -// this.getZ() + 5 * this.getLookAngle().z, -// 100, 7, 0.02, 7, 0.005); -// -// double x = worldPosition.x + 9 * this.getLookAngle().x; -// double y = worldPosition.y + 9 * this.getLookAngle().y; -// double z = worldPosition.z + 9 * this.getLookAngle().z; -// -// server.sendParticles(ParticleTypes.CAMPFIRE_COSY_SMOKE, x, y, z, 10, 0.4, 0.4, 0.4, 0.0075); -// server.sendParticles(ParticleTypes.CLOUD, x, y, z, 10, 0.4, 0.4, 0.4, 0.0075); -// -// int count = 6; -// -// for (float i = 9.5f; i < 16; i += .5f) { -// server.sendParticles(ParticleTypes.CAMPFIRE_COSY_SMOKE, -// this.getX() + i * this.getLookAngle().x, -// this.getEyeY() + i * this.getLookAngle().y, -// this.getZ() + i * this.getLookAngle().z, -// Mth.clamp(count--, 1, 5), 0.15, 0.15, 0.15, 0.0025); -// } + if (ammoCount <= 0) return; + InventoryTool.consumeItem(player.getInventory().items, ammo, 1); } + + var entityToSpawn = ((SmallCannonShellWeapon) getWeapon(0)).create(player); + + Matrix4f transform = getBarrelTransform(1); + Vector4f worldPosition = transformPosition(transform, 0f, 0.4f, 2.6875f); + + entityToSpawn.setPos(worldPosition.x, worldPosition.y, worldPosition.z); + entityToSpawn.shoot(getLookAngle().x, getLookAngle().y, getLookAngle().z, 40, 0.3f); + level().addFreshEntity(entityToSpawn); + + if (!player.level().isClientSide) { + if (player instanceof ServerPlayer serverPlayer) { + serverPlayer.level().playSound(null, serverPlayer.getOnPos(), ModSounds.HPJ_11_FIRE_3P.get(), SoundSource.PLAYERS, 8, random.nextFloat() * 0.05f + 1); + } + } + + this.entityData.set(GUN_ROTATE, entityData.get(GUN_ROTATE) + 0.5f); + this.entityData.set(HEAT, this.entityData.get(HEAT) + 1); + this.entityData.set(ANIM_TIME, 1); } + public Matrix4f getBarrelTransform(float ticks) { + Matrix4f transformV = getVehicleFlatTransform(ticks); + + Matrix4f transform = new Matrix4f(); + Vector4f worldPosition = transformPosition(transform, 0, 1.375f, 0.25f); + + transformV.translate(worldPosition.x, worldPosition.y, worldPosition.z); + transformV.rotate(Axis.XP.rotationDegrees(Mth.lerp(ticks, xRotO, getXRot()))); + return transformV; + } @Override public void travel() { @@ -322,7 +301,6 @@ public class Hpj11Entity extends VehicleEntity implements GeoEntity, CannonEntit @Override public void registerControllers(AnimatableManager.ControllerRegistrar data) { -// data.add(new AnimationController<>(this, "movement", 0, this::movementPredicate)); } @Override @@ -332,17 +310,18 @@ public class Hpj11Entity extends VehicleEntity implements GeoEntity, CannonEntit @Override public float getMaxHealth() { - return VehicleConfig.MK42_HP.get(); + return VehicleConfig.HPJ11_HP.get(); } @Override public int mainGunRpm(Player player) { - return 1200; + return 2400; } @Override public boolean canShoot(Player player) { - return true; + var ammo = ModItems.SMALL_SHELL.get(); + return (InventoryTool.countItem(player.getInventory().items, ammo) > 0 || InventoryTool.hasCreativeAmmoBox(player)) && !cannotFire; } @Override @@ -371,6 +350,6 @@ public class Hpj11Entity extends VehicleEntity implements GeoEntity, CannonEntit @Override public ResourceLocation getVehicleIcon() { - return Mod.loc("textures/vehicle_icon/sherman_icon.png"); + return Mod.loc("textures/vehicle_icon/hpj_11.png"); } } 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 c0599644e..c800c67e9 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 @@ -57,7 +57,6 @@ public abstract class MobileVehicleEntity extends EnergyVehicleEntity implements public static final EntityDataAccessor YAW = SynchedEntityData.defineId(MobileVehicleEntity.class, EntityDataSerializers.FLOAT); public static final EntityDataAccessor FIRE_ANIM = SynchedEntityData.defineId(MobileVehicleEntity.class, EntityDataSerializers.INT); - public static final EntityDataAccessor HEAT = SynchedEntityData.defineId(MobileVehicleEntity.class, EntityDataSerializers.INT); public static final EntityDataAccessor COAX_HEAT = SynchedEntityData.defineId(MobileVehicleEntity.class, EntityDataSerializers.INT); public static final EntityDataAccessor AMMO = SynchedEntityData.defineId(MobileVehicleEntity.class, EntityDataSerializers.INT); @@ -98,7 +97,6 @@ public abstract class MobileVehicleEntity extends EnergyVehicleEntity implements public double recoilShake; public double recoilShakeO; - public boolean cannotFire; public boolean cannotFireCoax; public int reloadCoolDown; @@ -184,10 +182,6 @@ public abstract class MobileVehicleEntity extends EnergyVehicleEntity implements turretYRotO = deltaT + getTurretYRot(); } - if (this.entityData.get(HEAT) > 0) { - this.entityData.set(HEAT, this.entityData.get(HEAT) - 1); - } - if (this.entityData.get(COAX_HEAT) > 0) { this.entityData.set(COAX_HEAT, this.entityData.get(COAX_HEAT) - 1); } @@ -196,10 +190,6 @@ public abstract class MobileVehicleEntity extends EnergyVehicleEntity implements this.entityData.set(FIRE_ANIM, this.entityData.get(FIRE_ANIM) - 1); } - if (this.entityData.get(HEAT) < 40) { - cannotFire = false; - } - if (this.entityData.get(COAX_HEAT) < 40) { cannotFireCoax = false; } @@ -208,10 +198,6 @@ public abstract class MobileVehicleEntity extends EnergyVehicleEntity implements decoyReloadCoolDown--; } - if (this.entityData.get(HEAT) > 100 && !cannotFire) { - cannotFire = true; - this.level().playSound(null, this.getOnPos(), ModSounds.MINIGUN_OVERHEAT.get(), SoundSource.PLAYERS, 1, 1); - } if (this.entityData.get(COAX_HEAT) > 100) { cannotFireCoax = true; this.level().playSound(null, this.getOnPos(), ModSounds.MINIGUN_OVERHEAT.get(), SoundSource.PLAYERS, 1, 1); @@ -447,7 +433,7 @@ public abstract class MobileVehicleEntity extends EnergyVehicleEntity implements public void baseCollideBlock() { if (level() instanceof ServerLevel) { - AABB aabb = getBoundingBox().inflate(0.25, 1, 0.25).expandTowards(0, 0.5 , 1).move(this.getDeltaMovement().scale(0.6)); + AABB aabb = getBoundingBox().inflate(0.25, 1, 0.25).expandTowards(0, 0.5, 1).move(this.getDeltaMovement().scale(0.6)); BlockPos.betweenClosedStream(aabb).forEach((pos) -> { BlockState blockstate = this.level().getBlockState(pos); if (blockstate.is(Blocks.LILY_PAD) || @@ -461,7 +447,7 @@ public abstract class MobileVehicleEntity extends EnergyVehicleEntity implements public void collideBlock() { if (!VehicleConfig.COLLISION_DESTROY_BLOCKS.get()) return; - AABB aabb = getBoundingBox().inflate(0.25, 1, 0.25).expandTowards(0, 0.5 , 1).move(this.getDeltaMovement().scale(0.6)); + AABB aabb = getBoundingBox().inflate(0.25, 1, 0.25).expandTowards(0, 0.5, 1).move(this.getDeltaMovement().scale(0.6)); BlockPos.betweenClosedStream(aabb).forEach((pos) -> { BlockState blockstate = this.level().getBlockState(pos); if (blockstate.is(ModTags.Blocks.SOFT_COLLISION)) { @@ -472,7 +458,7 @@ public abstract class MobileVehicleEntity extends EnergyVehicleEntity implements public void collideHardBlock() { if (!VehicleConfig.COLLISION_DESTROY_HARD_BLOCKS.get()) return; - AABB aabb = getBoundingBox().inflate(0.25, 1, 0.25).expandTowards(0, 0.5 , 1).move(this.getDeltaMovement().scale(0.6)); + AABB aabb = getBoundingBox().inflate(0.25, 1, 0.25).expandTowards(0, 0.5, 1).move(this.getDeltaMovement().scale(0.6)); BlockPos.betweenClosedStream(aabb).forEach((pos) -> { BlockState blockstate = this.level().getBlockState(pos); if (blockstate.is(ModTags.Blocks.HARD_COLLISION)) { @@ -484,7 +470,7 @@ public abstract class MobileVehicleEntity extends EnergyVehicleEntity implements public void collideBlockBeastly() { if (!VehicleConfig.COLLISION_DESTROY_BLOCKS_BEASTLY.get()) return; - AABB aabb = getBoundingBox().inflate(0.25, 1, 0.25).expandTowards(0, 0.52 , 1).move(this.getDeltaMovement().scale(0.6)); + AABB aabb = getBoundingBox().inflate(0.25, 1, 0.25).expandTowards(0, 0.52, 1).move(this.getDeltaMovement().scale(0.6)); BlockPos.betweenClosedStream(aabb).forEach((pos) -> { BlockState blockstate = this.level().getBlockState(pos); float hardness = blockstate.getBlock().defaultDestroyTime(); @@ -767,7 +753,6 @@ public abstract class MobileVehicleEntity extends EnergyVehicleEntity implements .define(YAW, 0f) .define(AMMO, 0) .define(FIRE_ANIM, 0) - .define(HEAT, 0) .define(COAX_HEAT, 0) .define(DECOY_COUNT, 0); } diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/VehicleEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/VehicleEntity.java index b5ba51f8d..3c7041121 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/VehicleEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/VehicleEntity.java @@ -71,12 +71,12 @@ import static com.atsuishio.superbwarfare.client.RenderHelper.preciseBlit; import static com.atsuishio.superbwarfare.tools.ParticleTool.sendParticle; public abstract class VehicleEntity extends Entity { - public static final EntityDataAccessor HEALTH = SynchedEntityData.defineId(VehicleEntity.class, EntityDataSerializers.FLOAT); public static final EntityDataAccessor LAST_ATTACKER_UUID = SynchedEntityData.defineId(VehicleEntity.class, EntityDataSerializers.STRING); public static final EntityDataAccessor LAST_DRIVER_UUID = SynchedEntityData.defineId(VehicleEntity.class, EntityDataSerializers.STRING); public static final EntityDataAccessor DELTA_ROT = SynchedEntityData.defineId(VehicleEntity.class, EntityDataSerializers.FLOAT); public static final EntityDataAccessor> SELECTED_WEAPON = SynchedEntityData.defineId(VehicleEntity.class, ModSerializers.INT_LIST_SERIALIZER.get()); + public static final EntityDataAccessor HEAT = SynchedEntityData.defineId(VehicleEntity.class, EntityDataSerializers.INT); public VehicleWeapon[][] availableWeapons; @@ -103,6 +103,8 @@ public abstract class VehicleEntity extends Entity { public float gunYRotO; public float gunXRotO; + public boolean cannotFire; + // 自定义骑乘 private final List orderedPassengers = generatePassengersList(); @@ -268,6 +270,7 @@ public abstract class VehicleEntity extends Entity { .define(LAST_ATTACKER_UUID, "undefined") .define(LAST_DRIVER_UUID, "undefined") .define(DELTA_ROT, 0f) + .define(HEAT, 0) .define(SELECTED_WEAPON, IntList.of(new int[this.getMaxPassengers()])); // 怎么还不给玩动态注册了(恼) } @@ -559,6 +562,19 @@ public abstract class VehicleEntity extends Entity { repairCoolDown--; } + if (this.entityData.get(HEAT) > 0) { + this.entityData.set(HEAT, this.entityData.get(HEAT) - 1); + } + + if (this.entityData.get(HEAT) < 40) { + cannotFire = false; + } + + if (this.entityData.get(HEAT) > 100 && !cannotFire) { + cannotFire = true; + this.level().playSound(null, this.getOnPos(), ModSounds.MINIGUN_OVERHEAT.get(), SoundSource.PLAYERS, 1, 1); + } + this.prevRoll = this.getRoll(); float delta = Math.abs(getYRot() - yRotO); diff --git a/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java b/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java index b6bb8ac02..e76545783 100644 --- a/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java @@ -917,6 +917,11 @@ public class ClientEventHandler { 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/ModEntities.java b/src/main/java/com/atsuishio/superbwarfare/init/ModEntities.java index fb73cdb3d..525853539 100644 --- a/src/main/java/com/atsuishio/superbwarfare/init/ModEntities.java +++ b/src/main/java/com/atsuishio/superbwarfare/init/ModEntities.java @@ -48,36 +48,36 @@ public class ModEntities { // Projectiles public static final DeferredHolder, EntityType> TASER_BULLET = register("taser_bullet", - EntityType.Builder.of(TaserBulletEntity::new, MobCategory.MISC).setTrackingRange(64) + EntityType.Builder.of(TaserBulletEntity::new, MobCategory.MISC).noSave().setTrackingRange(64) .setUpdateInterval(1).sized(0.5f, 0.5f)); // Fast Projectiles public static final DeferredHolder, EntityType> SMALL_CANNON_SHELL = register("small_cannon_shell", - EntityType.Builder.of(SmallCannonShellEntity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(false).setTrackingRange(64).setUpdateInterval(1).sized(0.5f, 0.5f)); + EntityType.Builder.of(SmallCannonShellEntity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(false).noSave().setTrackingRange(64).setUpdateInterval(1).sized(0.5f, 0.5f)); public static final DeferredHolder, EntityType> RPG_ROCKET = register("rpg_rocket", - EntityType.Builder.of(RpgRocketEntity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(false).setTrackingRange(64).setUpdateInterval(1).sized(0.5f, 0.5f)); + EntityType.Builder.of(RpgRocketEntity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(false).noSave().setTrackingRange(64).setUpdateInterval(1).sized(0.5f, 0.5f)); public static final DeferredHolder, EntityType> MORTAR_SHELL = register("mortar_shell", - EntityType.Builder.of(MortarShellEntity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(false).setTrackingRange(64).setUpdateInterval(1).sized(0.5f, 0.5f)); + EntityType.Builder.of(MortarShellEntity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(false).noSave().setTrackingRange(64).setUpdateInterval(1).sized(0.5f, 0.5f)); public static final DeferredHolder, EntityType> PROJECTILE = register("projectile", - EntityType.Builder.of(ProjectileEntity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(false).setTrackingRange(64).noSave().noSummon().sized(0.25f, 0.25f)); + EntityType.Builder.of(ProjectileEntity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(false).noSave().setTrackingRange(64).noSave().noSummon().sized(0.25f, 0.25f)); public static final DeferredHolder, EntityType> CANNON_SHELL = register("cannon_shell", - EntityType.Builder.of(CannonShellEntity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(false).setTrackingRange(64).setUpdateInterval(1).sized(0.5f, 0.5f)); + EntityType.Builder.of(CannonShellEntity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(false).noSave().setTrackingRange(64).setUpdateInterval(1).sized(0.5f, 0.5f)); public static final DeferredHolder, EntityType> GUN_GRENADE = register("gun_grenade", - EntityType.Builder.of(GunGrenadeEntity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(false).setTrackingRange(64).setUpdateInterval(1).sized(0.5f, 0.5f)); + EntityType.Builder.of(GunGrenadeEntity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(false).noSave().setTrackingRange(64).setUpdateInterval(1).sized(0.5f, 0.5f)); public static final DeferredHolder, EntityType> MELON_BOMB = register("melon_bomb", - EntityType.Builder.of(MelonBombEntity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(false).setTrackingRange(64).setUpdateInterval(1).sized(1f, 1f)); + EntityType.Builder.of(MelonBombEntity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(false).noSave().setTrackingRange(64).setUpdateInterval(1).sized(1f, 1f)); public static final DeferredHolder, EntityType> HAND_GRENADE = register("hand_grenade", - EntityType.Builder.of(HandGrenadeEntity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(false).setTrackingRange(64).setUpdateInterval(1).sized(0.3f, 0.3f)); + EntityType.Builder.of(HandGrenadeEntity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(false).noSave().setTrackingRange(64).setUpdateInterval(1).sized(0.3f, 0.3f)); public static final DeferredHolder, EntityType> RGO_GRENADE = register("rgo_grenade", - EntityType.Builder.of(RgoGrenadeEntity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(false).setTrackingRange(64).setUpdateInterval(1).sized(0.3f, 0.3f)); + EntityType.Builder.of(RgoGrenadeEntity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(false).noSave().setTrackingRange(64).setUpdateInterval(1).sized(0.3f, 0.3f)); public static final DeferredHolder, EntityType> JAVELIN_MISSILE = register("javelin_missile", - EntityType.Builder.of(JavelinMissileEntity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(false).setTrackingRange(64).setUpdateInterval(1).sized(0.5f, 0.5f)); + EntityType.Builder.of(JavelinMissileEntity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(false).noSave().setTrackingRange(64).setUpdateInterval(1).sized(0.5f, 0.5f)); public static final DeferredHolder, EntityType> HELI_ROCKET = register("heli_rocket", - EntityType.Builder.of(HeliRocketEntity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(false).setTrackingRange(64).setUpdateInterval(1).sized(0.5f, 0.5f)); + EntityType.Builder.of(HeliRocketEntity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(false).noSave().setTrackingRange(64).setUpdateInterval(1).sized(0.5f, 0.5f)); public static final DeferredHolder, EntityType> WG_MISSILE = register("wg_missile", - EntityType.Builder.of(WgMissileEntity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(false).setTrackingRange(64).setUpdateInterval(3).fireImmune().sized(0.5f, 0.5f)); + EntityType.Builder.of(WgMissileEntity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(false).noSave().setTrackingRange(64).setUpdateInterval(3).fireImmune().sized(0.5f, 0.5f)); public static final DeferredHolder, EntityType> SWARM_DRONE = register("swarm_drone", - EntityType.Builder.of(SwarmDroneEntity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(false).setTrackingRange(64).setUpdateInterval(1).fireImmune().sized(0.5f, 0.5f)); + EntityType.Builder.of(SwarmDroneEntity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(false).noSave().setTrackingRange(64).setUpdateInterval(1).fireImmune().sized(0.5f, 0.5f)); // Vehicles public static final DeferredHolder, EntityType> MK_42 = register("mk_42", diff --git a/src/main/java/com/atsuishio/superbwarfare/init/ModItems.java b/src/main/java/com/atsuishio/superbwarfare/init/ModItems.java index 97abc90e8..6e0f8bb06 100644 --- a/src/main/java/com/atsuishio/superbwarfare/init/ModItems.java +++ b/src/main/java/com/atsuishio/superbwarfare/init/ModItems.java @@ -247,6 +247,7 @@ public class ModItems { public static final DeferredHolder INSIDIOUS_BLUEPRINT = ITEMS.register("insidious_blueprint", () -> new BlueprintItem(Rarity.EPIC)); public static final DeferredHolder MK_42_BLUEPRINT = ITEMS.register("mk_42_blueprint", () -> new BlueprintItem(ModEnumExtensions.getLegendary())); public static final DeferredHolder MLE_1934_BLUEPRINT = ITEMS.register("mle_1934_blueprint", () -> new BlueprintItem(ModEnumExtensions.getLegendary())); + public static final DeferredHolder HPJ_11_BLUEPRINT = ITEMS.register("hpj_11_blueprint", () -> new BlueprintItem(ModEnumExtensions.getLegendary())); public static final DeferredHolder ANNIHILATOR_BLUEPRINT = ITEMS.register("annihilator_blueprint", () -> new BlueprintItem(ModEnumExtensions.getLegendary())); public static final DeferredHolder LIGHT_ARMAMENT_MODULE = ITEMS.register("light_armament_module", () -> new Item(new Item.Properties().rarity(Rarity.RARE))); diff --git a/src/main/java/com/atsuishio/superbwarfare/init/ModSounds.java b/src/main/java/com/atsuishio/superbwarfare/init/ModSounds.java index da355e73e..5b604e387 100644 --- a/src/main/java/com/atsuishio/superbwarfare/init/ModSounds.java +++ b/src/main/java/com/atsuishio/superbwarfare/init/ModSounds.java @@ -439,6 +439,7 @@ 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/1130.geo.json b/src/main/resources/assets/superbwarfare/geo/1130.geo.json index 0e6934bbc..7ce7a0b30 100644 --- a/src/main/resources/assets/superbwarfare/geo/1130.geo.json +++ b/src/main/resources/assets/superbwarfare/geo/1130.geo.json @@ -6,7 +6,7 @@ "identifier": "geometry.unknown", "texture_width": 128, "texture_height": 128, - "visible_bounds_width": 5, + "visible_bounds_width": 13, "visible_bounds_height": 5.5, "visible_bounds_offset": [0, 2.25, 0] }, @@ -132,12 +132,12 @@ "origin": [-24, 4, -20], "size": [48, 1.6, 40], "uv": { - "north": {"uv": [65, 41], "uv_size": [24, 1]}, - "east": {"uv": [69, 3], "uv_size": [20, 1]}, - "south": {"uv": [67, 8], "uv_size": [24, 1]}, - "west": {"uv": [69, 4], "uv_size": [20, 1]}, - "up": {"uv": [0, 0], "uv_size": [24, 20]}, - "down": {"uv": [0, 40], "uv_size": [24, -20]} + "north": {"uv": [55, 41], "uv_size": [34, 1]}, + "east": {"uv": [59, 3], "uv_size": [30, 1]}, + "south": {"uv": [57, 8], "uv_size": [34, 1]}, + "west": {"uv": [59, 4], "uv_size": [30, 1]}, + "up": {"uv": [3, 0], "uv_size": [21, 20]}, + "down": {"uv": [3, 40], "uv_size": [21, -20]} } }, { @@ -1606,6 +1606,75 @@ "parent": "paotiroll", "pivot": [0, 22, -4] }, + { + "name": "flare", + "parent": "roll", + "pivot": [0, 26.35, -45.24844] + }, + { + "name": "bone", + "parent": "flare", + "pivot": [0, 26.35, -45.24844], + "rotation": [90, 0, 0], + "cubes": [ + { + "origin": [-56.4, 22.75, -45.24844], + "size": [61.44, 12.96, 0], + "pivot": [0, 29.23, -45.24844], + "rotation": [-60, 0, 90], + "uv": { + "north": {"uv": [128, 100], "uv_size": [-12.5, 28]}, + "east": {"uv": [115.5, 100], "uv_size": [12.5, 28]}, + "south": {"uv": [115.5, 100], "uv_size": [12.5, 28]}, + "west": {"uv": [115.5, 100], "uv_size": [12.5, 28]}, + "up": {"uv": [128, 128], "uv_size": [-12.5, -28]}, + "down": {"uv": [128, 128], "uv_size": [-12.5, -28]} + } + }, + { + "origin": [-56.4, 22.75, -45.24844], + "size": [61.44, 12.96, 0], + "pivot": [0, 29.23, -45.24844], + "rotation": [-121, 0, 90], + "uv": { + "north": {"uv": [128, 100], "uv_size": [-12.5, 28]}, + "east": {"uv": [115.5, 100], "uv_size": [12.5, 28]}, + "south": {"uv": [115.5, 100], "uv_size": [12.5, 28]}, + "west": {"uv": [115.5, 100], "uv_size": [12.5, 28]}, + "up": {"uv": [128, 128], "uv_size": [-12.5, -28]}, + "down": {"uv": [128, 128], "uv_size": [-12.5, -28]} + } + }, + { + "origin": [-56.4, 22.75, -45.24844], + "size": [61.44, 12.96, 0], + "pivot": [0, 29.23, -45.24844], + "rotation": [179, 0, 90], + "uv": { + "north": {"uv": [128, 100], "uv_size": [-12.5, 28]}, + "east": {"uv": [115.5, 100], "uv_size": [12.5, 28]}, + "south": {"uv": [115.5, 100], "uv_size": [12.5, 28]}, + "west": {"uv": [115.5, 100], "uv_size": [12.5, 28]}, + "up": {"uv": [128, 128], "uv_size": [-12.5, -28]}, + "down": {"uv": [128, 128], "uv_size": [-12.5, -28]} + } + }, + { + "origin": [-6.48, 19.87, -45.24844], + "size": [12.96, 12.96, 0], + "pivot": [0, 26.35, -45.24844], + "rotation": [-90, 0, 0], + "uv": { + "north": {"uv": [128, 100], "uv_size": [-28, 28]}, + "east": {"uv": [100, 100], "uv_size": [28, 28]}, + "south": {"uv": [100, 100], "uv_size": [28, 28]}, + "west": {"uv": [100, 100], "uv_size": [28, 28]}, + "up": {"uv": [128, 128], "uv_size": [-28, -28]}, + "down": {"uv": [128, 128], "uv_size": [-28, -28]} + } + } + ] + }, { "name": "paoguanwaike", "parent": "roll", diff --git a/src/main/resources/assets/superbwarfare/geo/small_cannon_shell.geo.json b/src/main/resources/assets/superbwarfare/geo/small_cannon_shell.geo.json new file mode 100644 index 000000000..2393184bb --- /dev/null +++ b/src/main/resources/assets/superbwarfare/geo/small_cannon_shell.geo.json @@ -0,0 +1,37 @@ +{ + "format_version": "1.12.0", + "minecraft:geometry": [ + { + "description": { + "identifier": "geometry.unknown", + "texture_width": 16, + "texture_height": 16, + "visible_bounds_width": 2, + "visible_bounds_height": 2.5, + "visible_bounds_offset": [0, 0.75, 0] + }, + "bones": [ + { + "name": "bone", + "pivot": [0, 0, 0], + "cubes": [ + { + "origin": [-1, -2, -1], + "size": [2, 2, 2], + "pivot": [0, 0, 0], + "rotation": [0, -45, 0], + "uv": { + "north": {"uv": [0, 0], "uv_size": [1, 1]}, + "east": {"uv": [0, 1], "uv_size": [1, 1]}, + "south": {"uv": [1, 0], "uv_size": [1, 1]}, + "west": {"uv": [1, 1], "uv_size": [1, 1]}, + "up": {"uv": [0, 2], "uv_size": [1, 1]}, + "down": {"uv": [2, 1], "uv_size": [1, -1]} + } + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/superbwarfare/lang/en_us.json b/src/main/resources/assets/superbwarfare/lang/en_us.json index 26e1509d4..bfacf6318 100644 --- a/src/main/resources/assets/superbwarfare/lang/en_us.json +++ b/src/main/resources/assets/superbwarfare/lang/en_us.json @@ -109,6 +109,7 @@ "item.superbwarfare.m2hb_blueprint": "M2HB Blueprint", "item.superbwarfare.secondary_cataclysm_blueprint": "Secondary Cataclysm Blueprint", "item.superbwarfare.insidious_blueprint": "Insidious Blueprint", + "item.superbwarfare.hpj_11_blueprint": "H/PJ-11 CIWS Blueprint", "item.superbwarfare.common_material_pack": "Common Material Pack", "item.superbwarfare.rare_material_pack": "Rare Material Pack", diff --git a/src/main/resources/assets/superbwarfare/lang/zh_cn.json b/src/main/resources/assets/superbwarfare/lang/zh_cn.json index 62ee5c735..44c391a46 100644 --- a/src/main/resources/assets/superbwarfare/lang/zh_cn.json +++ b/src/main/resources/assets/superbwarfare/lang/zh_cn.json @@ -110,6 +110,7 @@ "item.superbwarfare.m2hb_blueprint": "M2HB重机枪蓝图", "item.superbwarfare.secondary_cataclysm_blueprint": "二次灾变蓝图", "item.superbwarfare.insidious_blueprint": "阴险蓝图", + "item.superbwarfare.hpj_11_blueprint": "H/PJ-11近防炮蓝图", "item.superbwarfare.common_material_pack": "普通材料包", "item.superbwarfare.rare_material_pack": "稀有材料包", diff --git a/src/main/resources/assets/superbwarfare/sounds.json b/src/main/resources/assets/superbwarfare/sounds.json index 3a4173ebb..37080e275 100644 --- a/src/main/resources/assets/superbwarfare/sounds.json +++ b/src/main/resources/assets/superbwarfare/sounds.json @@ -3043,5 +3043,21 @@ "stream": false } ] + }, + "hpj_11_fire_1p": { + "sounds": [ + { + "name": "superbwarfare:hpj11/hpj_11_fire_1p", + "stream": false + } + ] + }, + "hpj_11_fire_3p": { + "sounds": [ + { + "name": "superbwarfare:hpj11/hpj_11_fire_3p", + "stream": false + } + ] } } \ No newline at end of file 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 new file mode 100644 index 0000000000000000000000000000000000000000..19374402415e0ed5f1495c403a91aecb45071b2f GIT binary patch literal 8485 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/superbwarfare/sounds/hpj11/hpj_11_fire_3p.ogg b/src/main/resources/assets/superbwarfare/sounds/hpj11/hpj_11_fire_3p.ogg new file mode 100644 index 0000000000000000000000000000000000000000..5422bd6b2ec302c1b2e271b45ed58d84d8155215 GIT binary patch literal 6855 zcmb7Ic|6qJ_y3T6&z6M7Rz{Sug(%57D2B0*7(^JAG00LXgcxE7jiQXDP}C@jM`d5e zGR=%NWR0R8qN4mhGkTua^Zfq!eZRl^x^tb+IrpA(&%Nh;@3~I-`#S*a!0#d*vrQOf zYkX&uV+%hQiav{Fve-;30ALF&pHH!|{yt|r#T@x}VUA=2zl5;L@xoTjo`08{JGS-c zgJKhhBM=+!5Ffu#6$b}1D8yY;Lqit^gK3~3Drj%4pD*NG2*mrGBhCqe*7+^f(9}jj znTFUnw-xO(IpM?x@Bl!Zf{j#jTwewf07L+wu;Oq|bbG`4yXY%r7UI!KOlqpaqAx0` z4y2YEN~NQ_KpqyN?JEHQ96%hDCqHz;WT9bQZujg?dui1+CY6w^LD-#Ols)XWD4#WI zvS2hP$0O*<34n`a%p)H!ju!a_4rfp$19R$Y?vIqZPn*eS*Sd7Kg%p45cvJ890bb6`UJz}=@+P2jHqB@9Q zVZ{sRhboy-sfU-z z1MU89cv<0N4DOrvpj2zYRY)wJ3oR~RBA+D}mM)Z42y2HH%cbGX;pNxt5WDx2!mhGB zhX6pl$Umc4K2ZvtBwtDly8D&9~G79YP6IUxXhIsjMGp*i`a zk!SB_$kYOBM1Lp53gvIspOiukAyBFM9wOIcj>)*%$0RvVugp%36kkbT{IRS#FM$L9* z+ef2*@N@_>+x5>40Dz_p0c++_qGXRyry+D`2z8{R5%ND38WURJ!e+BhT0w(v($O8c z&6&{wsU`wZi@8{QR8Oix`-P7pT1glAvlTfmrsbI?T>ux&3=jd&PN{1$C%Wb5h{Y!n z)5QA&_JKq!!2m8x5)bMm-*-e?lXWTj;AbkLll*kp9!@Ti<_8ah^Wg8X2%n(qPQa86 z5aE$0Wgsk}v&2v#D2eDpkuM=&JN0LX*9NT0iP!;s=uHIkGn8WWf#^ulhZe+x_Zqtl z_*07qp~3-NUk0m>S@k1z`W;bJBo4GYLT9RSCi{V$p=`{! zGiqo}$36_zkMwg5L%KTo4XvYG*Kqd8Sodr{rgR-MzAJHv9y=L^LNPTvxvs^IFtTUp zxXEue)LPI%92FNkzJ~M9!=b*JF}}tkb7FnSey6`BjF)e;eo1}sVDZ5xzCTpEUO(o4 zu`=3th=3dUh8go8ZA||%wb^Oa&s9$Ku2 zjW#|KN75Kbciluww4S5g7jz?bdj=aODO`BYc?F?Qt-y3uH&+huP zPaCbF8wPU`c*Qa4U7RfXQqwp<5qXM949LswarL@spY*;b$w!PCx-& zdW$4Hxe`i6`Zbns{S*2pdhK)W!rcv zc})Tnr3YeQvogPpL+PL@b^0(UU>T=LgMQEl!L?$5s>)mPgD9`sa(zyz(`9_RjaqVo zdg|8m-7`R_3+RCtQm!2r2wPqjY~xj0q~f{cTZvhHkmg)0Lba86Ed$sm3j*YO*wR_YZqqk^am zXL9!JAfuJ86b`?*hO}-I6&<&YgSwU;4NUn zC7&Q*0%nB-6HBNv0C+XA0g$G6O}l`0H~;}NO-Qp_P$hU-qRYVsq!Qt*&;P4o-KziZ zMgo|3o&+YgyxuJE>^Jkdl8{)z0lWsYavv~84L&FpztxzLibo)hv9|* zyMW%*t!E-`z*;?mmg;WN(G}!bFgr0KOZrsm%#C6{GdokrVD@cS+2RsZrO!PX%?6AL z3IQU#x|GM6VNQC|9;{_j0^*F5V68-~5C~vXI1E(7%7-nXzj^T)zj;LjgyuF+nP3M( zl-UpD!8^9cG8auY>^BceV(Mc`p(HTrR@u&02%z*gCHgmo_^V$r0{(jhIE+`GHI~^F z#WS@qDW+W(rAiV9fb$dJmFUG$;OpobpSI5<5?}>Bm?}dkZoyD<=0Yd7Lz*Fpe9#sm zSpa%Xro;vsPspag5|gqd-T5VUfZ41FGj(FW!mgr`!3J>i@FD5YupqC>DiVoAY z0HQh6JU`>pQdc6K1K9j>jMh!1VHZ|0i5FuKpH7@Kb!~+%KHQ>Z1|NLE=bI!Q#|h{O zO=zWuBOcd;;!f&1pvD?y#&fjXAHB4&&%;Wrw~XRB6?2|UH2nI2=ip!i6m7d*rHwY@ zgO<c(FX zTy)q!uW789UV8cR+fSB(3-v4OuyX`uX6I6H*9EiU)=*0Ocipf3>IRv8`h788|lsqM-?17wrKU0 zINrMhcqdc!gkRh1%6Ggo8*D*mUOPZ={`gP`#xd(k-|7?fw4cAC@0^1<)c+Vi5E~1r zzLlj)5iZt5%|hJ54Ea+sY%T6NJ$O;`{+wiMxY7k^H&U?HWyD_fdZN9!&0F6Jy|kmd zFtv)2qA#>eg-Z;$4W2A1Io2Po^$PlUY>2~~cZa)~bx!-ZW27@j)dQ<=pEJ%G%J8(@ z+;-ciaRRyTu1ZW%cCbgLOuGI;C)~vvB>7G+*+Z!4Jcp z(g`Pff26staV!;mfL4((sC6?-aZaAENzT#MUjNTO(_5t;KT|j@Btjg(j6Cx3X`>aL zZC|md65h+c^8zgd_A}Q^yfwa#x{-7^FSTU#`@*KVDefadR*^r2{f^p^q28B6;kp#Q znov4yxaFOtXt--=xmxfiDaMd_0FS7kLVONzYFX*$ao0EblPuHn3G)os=e9zxzy2ZO?SLsw1at>Lo!SWHuY%fdGZ< z&p!~phqt<<3Iuwb4QhL?m1wfX283xENrv&Hq$IP8fd3|d;5Tt;4ZUWxkDdoEUtH(P z1w5R@ct+~fZUF*bz=TwvvTYH&w>#QV<0=2?p@Ed@u4`$$dja6()r-#$ZlpDQT{0X> zlZ(&{$EWY^tm-jgfX7|dXk)Y1A2ln6vj+HEGOl+b?{;o33j^3+s* zUdU>R@Bo91*_{l#TCIS)&f=98C>iq}ne{{Ib8WAMyFL9lJ=@oE&_a&^;A>E4SsVltPcp~whECRyt{yNd0YK1a`|La$E(E9WDnanGN=`n?(j!Oi z-+fXLyY-@J%xPUHCi3x|k5QupLwP@G@y5yTHgA)X=_@Kj7Cg^8{OaDZmm@-aKkGFl z8=SGe;r7C1tKm+*hmu??T4BbPyvkk5uso^th-gUen?4z%tHed2ymiu>6L3ck%ALX(N{0(_r7y`k{lgZ-6n z27uzO%y);|h8YCXI~}l>Z_WgDwn27VOuqQVn2q0rHKc4 zj(8{Q@d`*K+8Zpt%nSK+;6b&F-u-J@g{!B6zdD9F2oKrIaeO)VY*Qi>02*&sV);A( zuZPhP8GZc5J98uw1Fq)h^vGESwGK&Dl>7QKdMBlow14V8tD1}w&F*0J#Or=z-K ze9`Y7+^s9=6D1Ygx%f!M_FfqUV!G-OeJ;Bz-D3u-yddo@LQExn$yw{_uXgdN_kV!1 zm--g5xUZ?|z3!_Nd%q>+L!RnK94e09Z33ib@OEG0tS3ArD~&Z*`seUeDR#Nr>KGwI zVB*l8-8_2+ZVs=ByfI0A&}y1pED|>p{6+b!zzXI?mBd!}o?p+X39>Z_?3c6J5(LlD zKP1dWKFj{X*ToT~ZZNCfYc|?p^(^U3&=+z@Q`0E0A(DXNK(lKZltJ|m!n zzyE3MBubk@>cyqhJ%CQsAlf=J>H{hA<%^f4U+3!mFrh=K4(itjkI)Jf25xdT9WIY7 zi{P1!7sKt4yDeL4q`?+<%*>j{yDI$-gD=1>U3a*wv%ATga^Eu&R;i5Ad1};>_~Y$Q z>&;fD6>c>?oiYn3_57rm_dwaGQb>DZz?mh3H+M7-*Vn3OF1mU+ra0~k87!^kzJGs( zJ^W5;Z+1?%CYxMh)YyVBtsHpy&H2}Aiib|yq6YaQLYT6KAo;xUn5;?Z$W z{k$XYXk}3f!tu;9T72NlRj7;}JMc>toaa27nAgMf{(5eMHYX~c>a2ho@L934G;5xuXsxa(Q}{5j0)g~ydKB&S?TzTvo=@b}OFx#XOVE(A*{@Qw zHa#Py=fm@^nfZ<#)bsxAiPxmIGd_O)PDcB0CIwtP34b2-jDc&7cUT?!DOL(~rTDua z>)scto-KTdTn;R?9OAaKZ@-m^zgqb?zu1i;h#5(cpp_Z*rY-Hr4cvUOlFC`~Bf?sh zRL=i%%J4q=;bP3`WB1=9<~Cj(I{33yYbwpGv1#!XyQEy6%_j+W!Q3XJuK`*+3$Ura zJ;sH>RRO7l?zn@8jAk^p?&5LfIPaT$^$*ecoq~5KpX?2uoen@+S#iZ`eaFuCckMpn zF=cs2I|7H2Jr!zO8olf&mI0af@6YS4^82Z;5>AG%aoyO7IJrQ@ak>nS?ow~hn|4<6pH}loOW<()kYjY(h$sqp z=Gsg-my#0SbA<@BUQx8XXR&I-E`b%er=+ZP{$;kFkEO5eA6l_f^ayF;uJ+2W_xC?K zbM&@KzWb)h>%M#`|2h7eNA9Y`>7O(e_1smDhdRASh4C!z zSOSbO;oZMF`4$mCeU~?f#d#at-qiG~$-Z{2_0-+dv*_OFU-C_QM^lIhvBl)o!>xnwCt)fUyR#q5 zu{S$wRqVT4ab&G_4IcCGdc0HNNl#874#z literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/superbwarfare/textures/entity/1130.png b/src/main/resources/assets/superbwarfare/textures/entity/1130.png index 09e9466e38702bc3e01efa316ecaf90d3639ab76..ad710a5c7952c37e810934485a8bc9758c3ec577 100644 GIT binary patch literal 5812 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 literal 5794 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 HunPG1X06 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/superbwarfare/textures/entity/small_cannon_shell.png b/src/main/resources/assets/superbwarfare/textures/entity/small_cannon_shell.png new file mode 100644 index 0000000000000000000000000000000000000000..9e07e389f670064411d37623111ff99bb5ec06a5 GIT binary patch literal 110 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|G(24#Lo9le z|LoWPVb3gLuxo86?{N$YMWMO$I^&x_brVzHFE4+r*u!1oC-2@ zxPk+XS8g(2cxv~;ZoT7o#&d^%3BEI{X85(`+C1Cq*Q4YYr!k&8`fFnDOj`zq4fg&F zdQP3p^;=8tzNjraV93#sy-}RKChK*T;j4P~8E3>87+8cD7z8{R7#tKB85kN_2nxus zl@$3gvV2Rs3sgU3!Lf+@_6!akTlb0zGEAIylbM0xH!!)85)ROiVh~8t?PCI^UR>jiWuN>_z)1k z3=G-}Pyapsnte*dLFhG~%z?dor{3Q`h2j6fUB!Z@-!L*X{3R(!8XUIYWHz{Rt=V$U zGuBF(C&GRVF)rC}cRt+}^*Z^B&H>AuSo0lh(ZHl~Lbze_XI{A*r+y9Pd_XXc+duMp WJvjN0r)YZ&NUf)Np&S*Yyle&o*$4reNG*J=kUb ZF)X}4`+fAr`Z$nFJzf1=);T3K0RWcUTh9Oh literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/superbwarfare/textures/vehicle_icon/hpj_11.png b/src/main/resources/assets/superbwarfare/textures/vehicle_icon/hpj_11.png new file mode 100644 index 0000000000000000000000000000000000000000..f64b28fda09a5e8fbca00c264092fc489f2c1fd7 GIT binary patch literal 1460 zcmV;l1xxygP)q7hFcLB8sm4FR zo6$@4K;p@x2fY|CMlscksWGW1j~+}K4|>$ZSP~>nF>0EK7fVbHm4$&aACHG&VS(Lc zTG)Bnd7oc0Da#DYv%AbQ@62p>01*+9RwDTs$=_?H%eFHKP_!LDoN*4oM9uBfwt~p6 zg6#kzVvh}5rvaR8 zu*eX}X_9BM%q1cjAz2_9G&l=z%XU83X#^nRFcpA^!&Cqw4pRY$I7|f~Ekkk;z*v(- zI!KO@?8_>Xh}0l?iR2xUTPY@=U($+rP~hvYnc zDaF(c;9UUoBww(RTaK3sz(FMY0elVM0|4Gb+{IG>ejxb?$=+iPCz(gEx$;i!)NLoF!*&4us#gK-=qiXuc&1Y^veDURdn6?W@6 zRsEt3SN@v-eyO?rldT}GQUPQr48w($m6bIBy@f(@irn{o6bc0xW2#ru-C5q4-Sv5O zbrnGnpj2wN-TbDm8)M$F9l~XLBT$C=`ud*sJg;0`v5he(7KG0GkPS)=6R9>wnMl~BYxjg0j{xtw2`|dLaPyujia$S)Ou97+X{U)lwbL#Y7r zOCta|lnNk+NR|Mcww*&xJ{3Sdoq=9kNkM-k`J~~$q@n`Ir?x5pl6ps~B`Sb?`X0cC zwnL=!D*$~IxFsrpeCh=7y6q4tm7xEYZjA~cpFAW70!5lq^R^L^6G(>lhf%RhDmwVm zMo4xb`S6c4t^*ivU7BNY6~Gk$_lz*uHyK^!x0yF=KM%5(_7!uEWG~540A<@*01S~FrOx}G77`eu5cnEV%z_*O+yj`9!Q@6 O0000