From f941cdc5f1cdd5f994a09ac1d93c1cdab0c7d39c Mon Sep 17 00:00:00 2001 From: Atsuihsio <842960157@qq.com> Date: Mon, 23 Sep 2024 18:52:19 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=AD=A6=E5=99=A8=E6=95=B0?= =?UTF-8?q?=E6=8D=AE,=E6=B7=BB=E5=8A=A0=E9=9C=B0=E5=BC=B9=E4=B8=93?= =?UTF-8?q?=E7=94=A8HUD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/model/item/M98bItemModel.java | 11 +- .../client/screens/CannonHudOverlay.java | 1 - .../client/screens/CrossHairOverlay.java | 45 ++++++- .../event/ClientEventHandler.java | 10 +- .../superbwarfare/event/GunEventHandler.java | 4 +- .../event/PlayerEventHandler.java | 12 +- .../item/gun/sniper/M98bItem.java | 45 +++---- .../network/message/ShootMessage.java | 2 +- .../superbwarfare/tools/TooltipTool.java | 15 ++- .../animations/m98b.animation.json | 125 ++++++++++++------ .../assets/superbwarfare/lang/en_us.json | 1 + .../assets/superbwarfare/lang/zh_cn.json | 1 + .../textures/screens/shotgun_hud.png | Bin 0 -> 21758 bytes .../data/superbwarfare/guns/aa_12.json | 2 +- .../data/superbwarfare/guns/bocek.json | 2 +- .../data/superbwarfare/guns/devotion.json | 2 +- .../data/superbwarfare/guns/glock_17.json | 2 +- .../data/superbwarfare/guns/glock_18.json | 2 +- .../data/superbwarfare/guns/hk_416.json | 2 +- .../superbwarfare/guns/hunting_rifle.json | 3 +- .../data/superbwarfare/guns/k_98.json | 2 +- .../data/superbwarfare/guns/m_1911.json | 3 +- .../data/superbwarfare/guns/m_4.json | 2 +- .../data/superbwarfare/guns/m_98b.json | 2 +- .../data/superbwarfare/guns/mk_14.json | 2 +- .../data/superbwarfare/guns/mosin_nagant.json | 2 +- .../data/superbwarfare/guns/ntw_20.json | 2 +- .../data/superbwarfare/guns/qbz_95.json | 4 +- .../data/superbwarfare/guns/sentinel.json | 2 +- .../data/superbwarfare/guns/vector.json | 2 +- 30 files changed, 206 insertions(+), 104 deletions(-) create mode 100644 src/main/resources/assets/superbwarfare/textures/screens/shotgun_hud.png diff --git a/src/main/java/net/mcreator/superbwarfare/client/model/item/M98bItemModel.java b/src/main/java/net/mcreator/superbwarfare/client/model/item/M98bItemModel.java index beea95a77..98b4815ed 100644 --- a/src/main/java/net/mcreator/superbwarfare/client/model/item/M98bItemModel.java +++ b/src/main/java/net/mcreator/superbwarfare/client/model/item/M98bItemModel.java @@ -35,6 +35,9 @@ public class M98bItemModel extends GeoModel { public void setCustomAnimations(M98bItem animatable, long instanceId, AnimationState animationState) { CoreGeoBone gun = getAnimationProcessor().getBone("bone"); CoreGeoBone shen = getAnimationProcessor().getBone("shen"); + CoreGeoBone camera = getAnimationProcessor().getBone("camera"); + CoreGeoBone main = getAnimationProcessor().getBone("0"); + CoreGeoBone scope = getAnimationProcessor().getBone("scope2"); Player player = Minecraft.getInstance().player; if (player == null) return; @@ -68,14 +71,12 @@ public class M98bItemModel extends GeoModel { shen.setRotX(0.15f * (float) (0.18f * fp + fr)); shen.setRotZ(-0.01f * (float) (fp + 1.3 * fr)); } + scope.setPosZ(75.2f * (float) (fp + 0.54f * fr)); shen.setPosX(0.5f * (float)fr * (float)((player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables())).recoilHorizon * fp)); gun.setPosX(2.245f * (float) zp); - gun.setPosY(0.3f * (float) zp - (float) (0.2f * zpz)); - gun.setPosZ(4.2f * (float) zp + (float) (0.3f * zpz)); - gun.setRotZ((float) (0.02f * zpz)); stack.getOrCreateTag().putBoolean("HoloHidden", !(gun.getPosX() > 1.8)); @@ -99,10 +100,6 @@ public class M98bItemModel extends GeoModel { move.setRotY(Mth.DEG_TO_RAD * (float) turnRotY); move.setRotZ(2.7f * (float) mph + Mth.DEG_TO_RAD * (float) turnRotZ); - CoreGeoBone camera = getAnimationProcessor().getBone("camera"); - CoreGeoBone main = getAnimationProcessor().getBone("0"); - CoreGeoBone scope = getAnimationProcessor().getBone("scope2"); - float numR = (float) (1 - 0.88 * zt); float numP = (float) (1 - 0.68 * zt); diff --git a/src/main/java/net/mcreator/superbwarfare/client/screens/CannonHudOverlay.java b/src/main/java/net/mcreator/superbwarfare/client/screens/CannonHudOverlay.java index a5a667eac..9ed8fd704 100644 --- a/src/main/java/net/mcreator/superbwarfare/client/screens/CannonHudOverlay.java +++ b/src/main/java/net/mcreator/superbwarfare/client/screens/CannonHudOverlay.java @@ -91,7 +91,6 @@ public class CannonHudOverlay { preciseBlit(event.getGuiGraphics(), new ResourceLocation(ModUtils.MODID, "textures/screens/cannon/indicator.png"), k + (float) Math.tan(Mth.clamp(Mth.DEG_TO_RAD * diffY, -1.5, 1.5)) * 5 * i / 1.4f * (90 - Math.abs(player.getXRot())) / 90, l + (float) Math.tan(Mth.clamp(Mth.DEG_TO_RAD * diffX, -1.5, 1.5)) * 5 * j / 1.4f, 0, 0.0F, i, j, i, j); } else { preciseBlit(event.getGuiGraphics(), new ResourceLocation(ModUtils.MODID, "textures/screens/cannon/cannon_crosshair_notzoom.png"), k, l, 0, 0.0F, i, j, i, j); - preciseBlit(event.getGuiGraphics(), new ResourceLocation(ModUtils.MODID, "textures/screens/cannon/indicator.png"), k + (float) Math.tan(Mth.clamp(Mth.DEG_TO_RAD * diffY, -1.5, 1.5)) * i / 1.4f * (90 - Math.abs(player.getXRot())) / 90, l + (float) Math.tan(Mth.clamp(Mth.DEG_TO_RAD * diffX, -1.5, 1.5)) * j / 1.4f, 0, 0.0F, i, j, i, j); } } RenderSystem.depthMask(true); diff --git a/src/main/java/net/mcreator/superbwarfare/client/screens/CrossHairOverlay.java b/src/main/java/net/mcreator/superbwarfare/client/screens/CrossHairOverlay.java index 0e22eb3e9..e7a637fd2 100644 --- a/src/main/java/net/mcreator/superbwarfare/client/screens/CrossHairOverlay.java +++ b/src/main/java/net/mcreator/superbwarfare/client/screens/CrossHairOverlay.java @@ -12,6 +12,7 @@ import net.minecraft.client.gui.Font; import net.minecraft.client.renderer.GameRenderer; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraftforge.api.distmarker.Dist; @@ -28,6 +29,7 @@ public class CrossHairOverlay { public static int HIT_INDICATOR = 0; public static int HEAD_INDICATOR = 0; public static int KILL_INDICATOR = 0; + private static float scopeScale = 1f; @SubscribeEvent(priority = EventPriority.NORMAL) public static void eventHandler(RenderGuiEvent.Pre event) { @@ -39,6 +41,9 @@ public class CrossHairOverlay { } ItemStack stack = player.getMainHandItem(); double spread = ClientEventHandler.gunSpread + 3 * ClientEventHandler.firePos; + float deltaFrame = Minecraft.getInstance().getDeltaFrameTime(); + float moveX = (float) (-6 * ClientEventHandler.turnRot[1] - (player.isSprinting() ? 10 : 6) * ClientEventHandler.movePosX); + float moveY = (float) (-6 * ClientEventHandler.turnRot[0] + 6 * (float)ClientEventHandler.velocityY - (player.isSprinting() ? 10 : 6) * ClientEventHandler.movePosY - 2 * ClientEventHandler.firePos); RenderSystem.disableDepthTest(); RenderSystem.depthMask(false); @@ -47,16 +52,42 @@ public class CrossHairOverlay { RenderSystem.blendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO); RenderSystem.setShaderColor(1, 1, 1, 1); - float moveX = (float) (-6 * ClientEventHandler.turnRot[1] - (player.isSprinting() ? 10 : 6) * ClientEventHandler.movePosX); - float moveY = (float) (-6 * ClientEventHandler.turnRot[0] + 6 * (float)ClientEventHandler.velocityY - (player.isSprinting() ? 10 : 6) * ClientEventHandler.movePosY - 2 * ClientEventHandler.firePos); + scopeScale = (float) Mth.lerp(0.5F * deltaFrame, scopeScale, 1 + 1.5f * spread); + float f = (float)Math.min(w, h); + float f1 = Math.min((float)w / f, (float)h / f) * 0.012f * scopeScale; + float i = Mth.floor(f * f1); + float j = Mth.floor(f * f1); + float k = ((w - i) / 2) + moveX; + float l = ((h - j) / 2) + moveY; - if (shouldRenderCrossHair(player) || stack.is(ModItems.MINIGUN.get()) || (stack.is(ModItems.BOCEK.get()) && stack.getOrCreateTag().getBoolean("HoloHidden"))) { + if (shouldRenderCrossHair(player) || stack.is(ModItems.MINIGUN.get())) { preciseBlit(event.getGuiGraphics(), new ResourceLocation(ModUtils.MODID, "textures/screens/point.png"), w / 2f - 7.5f + moveX, h / 2f - 7.5f + moveY, 0, 0, 16, 16, 16, 16); if (!player.isSprinting() || player.getPersistentData().getDouble("noRun") > 0) { - preciseBlit(event.getGuiGraphics(), new ResourceLocation(ModUtils.MODID, "textures/screens/rexheng.png"), (float) (w / 2f - 13.5f - 2.8f * spread) + moveX, h / 2f - 7.5f + moveY, 0, 0, 16, 16, 16, 16); - preciseBlit(event.getGuiGraphics(), new ResourceLocation(ModUtils.MODID, "textures/screens/rexheng.png"), (float) (w / 2f - 2.5f + 2.8f * spread) + moveX, h / 2f - 7.5f + moveY, 0, 0, 16, 16, 16, 16); - preciseBlit(event.getGuiGraphics(), new ResourceLocation(ModUtils.MODID, "textures/screens/rexshu.png"), w / 2f - 7.5f + moveX, (float) (h / 2f - 2.5f + 2.8f * spread) + moveY, 0, 0, 16, 16, 16, 16); - preciseBlit(event.getGuiGraphics(), new ResourceLocation(ModUtils.MODID, "textures/screens/rexshu.png"), w / 2f - 7.5f + moveX, (float) (h / 2f - 13.5f - 2.8f * spread) + moveY, 0, 0, 16, 16, 16, 16); + if (stack.is(ModTags.Items.SHOTGUN)) { + preciseBlit(event.getGuiGraphics(), new ResourceLocation(ModUtils.MODID, "textures/screens/shotgun_hud.png"), k, l, 0, 0.0F, i, j, i, j); + } else { + preciseBlit(event.getGuiGraphics(), new ResourceLocation(ModUtils.MODID, "textures/screens/rexheng.png"), (float) (w / 2f - 13.5f - 2.8f * spread) + moveX, h / 2f - 7.5f + moveY, 0, 0, 16, 16, 16, 16); + preciseBlit(event.getGuiGraphics(), new ResourceLocation(ModUtils.MODID, "textures/screens/rexheng.png"), (float) (w / 2f - 2.5f + 2.8f * spread) + moveX, h / 2f - 7.5f + moveY, 0, 0, 16, 16, 16, 16); + preciseBlit(event.getGuiGraphics(), new ResourceLocation(ModUtils.MODID, "textures/screens/rexshu.png"), w / 2f - 7.5f + moveX, (float) (h / 2f - 2.5f + 2.8f * spread) + moveY, 0, 0, 16, 16, 16, 16); + preciseBlit(event.getGuiGraphics(), new ResourceLocation(ModUtils.MODID, "textures/screens/rexshu.png"), w / 2f - 7.5f + moveX, (float) (h / 2f - 13.5f - 2.8f * spread) + moveY, 0, 0, 16, 16, 16, 16); + } + } + } + + if (stack.is(ModItems.BOCEK.get())) { + + if (stack.getOrCreateTag().getBoolean("HoloHidden")) { + preciseBlit(event.getGuiGraphics(), new ResourceLocation(ModUtils.MODID, "textures/screens/point.png"), w / 2f - 7.5f + moveX, h / 2f - 7.5f + moveY, 0, 0, 16, 16, 16, 16); + if (!player.isSprinting() || player.getPersistentData().getDouble("noRun") > 0 || ClientEventHandler.pullPos > 0) { + if (ClientEventHandler.zoomTime < 0.1) { + preciseBlit(event.getGuiGraphics(), new ResourceLocation(ModUtils.MODID, "textures/screens/shotgun_hud.png"), k, l, 0, 0.0F, i, j, i, j); + } else { + preciseBlit(event.getGuiGraphics(), new ResourceLocation(ModUtils.MODID, "textures/screens/rexheng.png"), (float) (w / 2f - 13.5f - 2.8f * spread) + moveX, h / 2f - 7.5f + moveY, 0, 0, 16, 16, 16, 16); + preciseBlit(event.getGuiGraphics(), new ResourceLocation(ModUtils.MODID, "textures/screens/rexheng.png"), (float) (w / 2f - 2.5f + 2.8f * spread) + moveX, h / 2f - 7.5f + moveY, 0, 0, 16, 16, 16, 16); + preciseBlit(event.getGuiGraphics(), new ResourceLocation(ModUtils.MODID, "textures/screens/rexshu.png"), w / 2f - 7.5f + moveX, (float) (h / 2f - 2.5f + 2.8f * spread) + moveY, 0, 0, 16, 16, 16, 16); + preciseBlit(event.getGuiGraphics(), new ResourceLocation(ModUtils.MODID, "textures/screens/rexshu.png"), w / 2f - 7.5f + moveX, (float) (h / 2f - 13.5f - 2.8f * spread) + moveY, 0, 0, 16, 16, 16, 16); + } + } } } diff --git a/src/main/java/net/mcreator/superbwarfare/event/ClientEventHandler.java b/src/main/java/net/mcreator/superbwarfare/event/ClientEventHandler.java index 870545467..9864936a2 100644 --- a/src/main/java/net/mcreator/superbwarfare/event/ClientEventHandler.java +++ b/src/main/java/net/mcreator/superbwarfare/event/ClientEventHandler.java @@ -411,7 +411,7 @@ public class ClientEventHandler { fireSpread += 0.2; } - fireSpread = Mth.clamp(fireSpread - 0.1 * (Math.pow(fireSpread, 2) * times), 0, 100); + fireSpread = Mth.clamp(fireSpread - 0.6 * (Math.pow(fireSpread, 2) * times), 0, 100); firePosZ = Mth.clamp(firePosZ - 0.02 * times, 0, 0.6); if (0 < firePosTimer) { @@ -527,7 +527,13 @@ public class ClientEventHandler { return; } - double p = zoomPos; + double p; + if (stack.is(ModItems.BOCEK.get())) { + p = (pullPos + 0.25) * zoomTime; + } else { + p = zoomPos; + } + double zoom = stack.getOrCreateTag().getDouble("zoom") + stack.getOrCreateTag().getDouble("custom_zoom"); event.setFOV(event.getFOV() / (1.0 + p * (zoom - 1)) * (1 - 0.4 * breathTime)); diff --git a/src/main/java/net/mcreator/superbwarfare/event/GunEventHandler.java b/src/main/java/net/mcreator/superbwarfare/event/GunEventHandler.java index e889f6d80..2ab272717 100644 --- a/src/main/java/net/mcreator/superbwarfare/event/GunEventHandler.java +++ b/src/main/java/net/mcreator/superbwarfare/event/GunEventHandler.java @@ -256,7 +256,6 @@ public class GunEventHandler { //启动换弹 if (tag.getBoolean("start_reload")) { MinecraftForge.EVENT_BUS.post(new ReloadEvent.Pre(player, stack)); - if (stack.is(ModTags.Items.OPEN_BOLT)) { if (tag.getInt("ammo") == 0) { tag.putInt("gun_reloading_time", (int) tag.getDouble("empty_reload_time") + 2); @@ -272,6 +271,9 @@ public class GunEventHandler { stack.getOrCreateTag().putBoolean("is_empty_reloading", true); playGunEmptyReloadSounds(player); } + if (stack.getItem() == ModItems.DEVOTION.get()) { + tag.putInt("customRpm", 0); + } tag.putBoolean("start_reload", false); } diff --git a/src/main/java/net/mcreator/superbwarfare/event/PlayerEventHandler.java b/src/main/java/net/mcreator/superbwarfare/event/PlayerEventHandler.java index d26379211..0a3efc982 100644 --- a/src/main/java/net/mcreator/superbwarfare/event/PlayerEventHandler.java +++ b/src/main/java/net/mcreator/superbwarfare/event/PlayerEventHandler.java @@ -280,7 +280,7 @@ public class PlayerEventHandler { * 判断玩家是否在奔跑 */ private static void handlePlayerSprint(Player player) { - if (player.getMainHandItem().getOrCreateTag().getInt("flash_time") > 0) { + if (player.getMainHandItem().getOrCreateTag().getInt("flash_time") > 0 || player.getMainHandItem().getOrCreateTag().getInt("fire_animation") > 0) { player.getPersistentData().putDouble("noRun", 20); } @@ -383,8 +383,10 @@ public class PlayerEventHandler { player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { capability.bowPull = true; + capability.tacticalSprint = false; capability.syncPlayerVariables(player); }); + player.setSprinting(false); } if (tag.getDouble("power") == 1) { if (!player.level().isClientSide() && player instanceof ServerPlayer serverPlayer) { @@ -401,6 +403,14 @@ public class PlayerEventHandler { capability.syncPlayerVariables(player); }); } + + if (tag.getDouble("power") > 0) { + player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.tacticalSprint = false; + capability.syncPlayerVariables(player); + }); + player.setSprinting(false); + } } private static void handleGunRecoil(Player player) { diff --git a/src/main/java/net/mcreator/superbwarfare/item/gun/sniper/M98bItem.java b/src/main/java/net/mcreator/superbwarfare/item/gun/sniper/M98bItem.java index d552745fa..e8d2e0618 100644 --- a/src/main/java/net/mcreator/superbwarfare/item/gun/sniper/M98bItem.java +++ b/src/main/java/net/mcreator/superbwarfare/item/gun/sniper/M98bItem.java @@ -75,17 +75,13 @@ public class M98bItem extends GunItem implements GeoItem, AnimatedItem { transformType = type; } - private PlayState idlePredicate(AnimationState event) { + private PlayState fireAnimPredicate(AnimationState event) { LocalPlayer player = Minecraft.getInstance().player; if (player == null) return PlayState.STOP; ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; if (this.animationProcedure.equals("empty")) { - if (stack.getOrCreateTag().getInt("draw_time") < 16) { - return event.setAndContinue(RawAnimation.begin().thenLoop("animation.m98b.draw")); - } - if (stack.getOrCreateTag().getInt("bolt_action_anim") > 0) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m98b.shift")); } @@ -102,7 +98,25 @@ public class M98bItem extends GunItem implements GeoItem, AnimatedItem { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m98b.reload_normal")); } - if (player.isSprinting() && player.onGround() && player.getPersistentData().getDouble("noRun") == 0) { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.m98b.idle")); + } + return PlayState.STOP; + } + + private PlayState idlePredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + if (this.animationProcedure.equals("empty")) { + if (stack.getOrCreateTag().getInt("draw_time") < 16) { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.m98b.draw")); + } + + if (player.isSprinting() && player.onGround() + && player.getPersistentData().getDouble("noRun") == 0 + && !(stack.getOrCreateTag().getBoolean("is_normal_reloading") || stack.getOrCreateTag().getBoolean("is_empty_reloading"))) { if (player.hasEffect(MobEffects.MOVEMENT_SPEED) && stack.getOrCreateTag().getInt("bolt_action_anim") == 0) { return event.setAndContinue(RawAnimation.begin().thenLoop("animation.m98b.run_fast")); } else { @@ -115,25 +129,10 @@ public class M98bItem extends GunItem implements GeoItem, AnimatedItem { return PlayState.STOP; } - private PlayState procedurePredicate(AnimationState event) { - if (transformType != null && transformType.firstPerson()) { - if (!this.animationProcedure.equals("empty") && event.getController().getAnimationState() == AnimationController.State.STOPPED) { - event.getController().setAnimation(RawAnimation.begin().thenPlay(this.animationProcedure)); - if (event.getController().getAnimationState() == AnimationController.State.STOPPED) { - this.animationProcedure = "empty"; - event.getController().forceAnimationReset(); - } - } else if (this.animationProcedure.equals("empty")) { - return PlayState.STOP; - } - } - return PlayState.CONTINUE; - } - @Override public void registerControllers(AnimatableManager.ControllerRegistrar data) { - var procedureController = new AnimationController<>(this, "procedureController", 0, this::procedurePredicate); - data.add(procedureController); + var fireAnimController = new AnimationController<>(this, "fireAnimController", 1, this::fireAnimPredicate); + data.add(fireAnimController); var idleController = new AnimationController<>(this, "idleController", 4, this::idlePredicate); data.add(idleController); } diff --git a/src/main/java/net/mcreator/superbwarfare/network/message/ShootMessage.java b/src/main/java/net/mcreator/superbwarfare/network/message/ShootMessage.java index 02dabf298..789a046c2 100644 --- a/src/main/java/net/mcreator/superbwarfare/network/message/ShootMessage.java +++ b/src/main/java/net/mcreator/superbwarfare/network/message/ShootMessage.java @@ -188,7 +188,7 @@ public class ShootMessage { stack.getOrCreateTag().putBoolean("shoot", true); for (int index0 = 0; index0 < (int) stack.getOrCreateTag().getDouble("projectile_amount"); index0++) { - gunShoot(player, 2 * stack.getOrCreateTag().getDouble("spread")); + gunShoot(player, spared); } player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { diff --git a/src/main/java/net/mcreator/superbwarfare/tools/TooltipTool.java b/src/main/java/net/mcreator/superbwarfare/tools/TooltipTool.java index 6a2348100..8527e3f2b 100644 --- a/src/main/java/net/mcreator/superbwarfare/tools/TooltipTool.java +++ b/src/main/java/net/mcreator/superbwarfare/tools/TooltipTool.java @@ -40,6 +40,7 @@ public class TooltipTool { addLevelTips(tooltip, stack); addBypassTips(tooltip, stack); addPerkTips(tooltip, stack); + addRpmTips(tooltip, stack); } public static void addShotgunTips(List tooltip, ItemStack stack, int count) { @@ -55,6 +56,13 @@ public class TooltipTool { addLevelTips(tooltip, stack); addBypassTips(tooltip, stack); addPerkTips(tooltip, stack); + addRpmTips(tooltip, stack); + } + + private static void addRpmTips(List tooltip, ItemStack stack) { + tooltip.add(Component.translatable("des.superbwarfare.tips.rpm").withStyle(ChatFormatting.GRAY) + .append(Component.literal("").withStyle(ChatFormatting.RESET)) + .append(Component.literal(new DecimalFormat("##").format(ItemNBTTool.getDouble(stack, "rpm", 0) + ItemNBTTool.getDouble(stack, "customRpm", 0))).withStyle(ChatFormatting.GREEN))); } private static void addLevelTips(List tooltip, ItemStack stack) { @@ -186,6 +194,7 @@ public class TooltipTool { addLevelTips(tooltip, stack); addBypassTips(tooltip, stack); addPerkTips(tooltip, stack); + addRpmTips(tooltip, stack); stack.getCapability(ForgeCapabilities.ENERGY).ifPresent( e -> tooltip.add(Component.literal(e.getEnergyStored() + " / " + e.getMaxEnergyStored() + " FE").withStyle(ChatFormatting.GRAY)) @@ -202,7 +211,11 @@ public class TooltipTool { .append(Component.literal("").withStyle(ChatFormatting.RESET)) .append(Component.literal(new DecimalFormat("##.#").format(damage)).withStyle(ChatFormatting.GREEN))); - addLevelTips(tooltip, stack); + int upgradePoint = Mth.floor(ItemNBTTool.getDouble(stack, "UpgradePoint", 0)); + + tooltip.add(Component.translatable("des.superbwarfare.tips.upgradepoint").withStyle(ChatFormatting.GRAY) + .append(Component.literal("").withStyle(ChatFormatting.RESET)) + .append(Component.literal(String.valueOf(upgradePoint)).withStyle(ChatFormatting.GRAY).withStyle(ChatFormatting.BOLD))); addPerkTips(tooltip, stack); stack.getCapability(ForgeCapabilities.ENERGY).ifPresent( diff --git a/src/main/resources/assets/superbwarfare/animations/m98b.animation.json b/src/main/resources/assets/superbwarfare/animations/m98b.animation.json index ec9e9c1ec..7aa8f686c 100644 --- a/src/main/resources/assets/superbwarfare/animations/m98b.animation.json +++ b/src/main/resources/assets/superbwarfare/animations/m98b.animation.json @@ -243,61 +243,96 @@ }, "animation.m98b.shift": { "loop": "hold_on_last_frame", - "animation_length": 1, + "animation_length": 1.1, "override_previous_animation": true, "bones": { "0": { "rotation": { "0.0": { - "vector": [0, 0, 0] - }, - "0.05": { - "vector": [-1, 0, -3], - "easing": "easeInOutSine" - }, - "0.15": { - "vector": [-5.06695, -0.89397, 0.2229], - "easing": "easeInSine" - }, - "0.3": { - "vector": [-4.64234, 4.23541, 7.63209], - "easing": "easeInOutSine" - }, - "0.5": { - "vector": [-3.1436, -1.5688, -3.26245], - "easing": "easeInOutSine" - }, - "0.6": { - "vector": [-0.70997, -1.32962, -4.26107], - "easing": "easeInOutSine" - }, - "0.7": { "vector": [0, 0, 0], "easing": "easeInOutSine" + }, + "0.2": { + "vector": [-0.2, 0, -1], + "easing": "easeInElastic" + }, + "0.3": { + "vector": [-0.2584, -0.4688, 5.16075], + "easing": "easeInSine" + }, + "0.35": { + "vector": [-0.1745, -0.1155, 4.6568], + "easing": "easeInElastic" + }, + "0.45": { + "vector": [-0.6993, -0.252, -1.4861], + "easing": "easeInElastic" + }, + "0.6": { + "vector": [-2.25, -1, 4.82] + }, + "0.65": { + "vector": [-0.25, -0.5, 4.82] + }, + "0.7": { + "vector": [0.53655, 1.56915, 2.11954] + }, + "0.75": { + "vector": [0.9659, 0.52169, -2.4819], + "easing": "easeInOutSine" + }, + "0.85": { + "vector": [0.7935, 0.19563, -2.80573] + }, + "0.9": { + "vector": [0.49, 0, 0] + }, + "1.0": { + "vector": [0, 0, 0] } }, "position": { "0.0": { - "vector": [0, 0, 0] - }, - "0.1": { - "vector": [0, -0.1, -0.2], - "easing": "easeInOutSine" - }, - "0.3": { - "vector": [0, 0, 1.7], - "easing": "easeInElastic" - }, - "0.5": { - "vector": [-0.02, -0.1, -0.5], - "easing": "easeInElastic" - }, - "0.6": { - "vector": [-0.03, 0.1, 0.3] - }, - "0.7": { "vector": [0, 0, 0], "easing": "easeInOutSine" + }, + "0.15": { + "vector": [0, 0, 0], + "easing": "linear" + }, + "0.3": { + "vector": [-0.41, -0.23, 0.32] + }, + "0.45": { + "vector": [-0.1, -0.5, 0.3], + "easing": "easeInElastic" + }, + "0.55": { + "vector": [-0.1, -0.5, 0.6] + }, + "0.6": { + "vector": [-0.3, -0.5, -0.6] + }, + "0.65": { + "vector": [-0.3, -0.5, -0.6] + }, + "0.7": { + "vector": [-0.1, -0.2, 0.1], + "easing": "easeInElastic" + }, + "0.8": { + "vector": [0.2, -0.3, -0.1] + }, + "0.85": { + "vector": [0.14, -0.05, 0.2], + "easing": "easeInSine" + }, + "0.9": { + "vector": [0.04, 0.1, 0.24478] + }, + "1.0": { + "vector": [0, 0, 0], + "easing": "easeOutSine" } } }, @@ -395,6 +430,12 @@ }, "0.6": { "vector": [-15.7, -8.7, 13.8] + }, + "0.65": { + "vector": [-3072.7, -8.7, 13.8] + }, + "0.7": { + "vector": [0, 0, 0] } } }, diff --git a/src/main/resources/assets/superbwarfare/lang/en_us.json b/src/main/resources/assets/superbwarfare/lang/en_us.json index cfbc3aa15..aa06b2460 100644 --- a/src/main/resources/assets/superbwarfare/lang/en_us.json +++ b/src/main/resources/assets/superbwarfare/lang/en_us.json @@ -51,6 +51,7 @@ "des.superbwarfare.tips.bypass": "Armor Piercing: ", "des.superbwarfare.tips.distance": "Drone Distance: ", "des.superbwarfare.tips.upgradepoint": "Upgrade Point: ", + "des.superbwarfare.tips.rpm": "Rpm: ", "item.superbwarfare.vector_blueprint": "VECTOR Blueprint", "item.superbwarfare.m_60_blueprint": "M60 Blueprint", diff --git a/src/main/resources/assets/superbwarfare/lang/zh_cn.json b/src/main/resources/assets/superbwarfare/lang/zh_cn.json index d040fbf71..3765eb2c6 100644 --- a/src/main/resources/assets/superbwarfare/lang/zh_cn.json +++ b/src/main/resources/assets/superbwarfare/lang/zh_cn.json @@ -51,6 +51,7 @@ "des.superbwarfare.tips.level": "等级: ", "des.superbwarfare.tips.bypass": "护甲穿透: ", "des.superbwarfare.tips.distance": "无人机距离你: ", + "des.superbwarfare.tips.rpm": "射速: ", "item.superbwarfare.vector_blueprint": "短剑冲锋枪蓝图", "item.superbwarfare.m_60_blueprint": "M60通用机枪蓝图", diff --git a/src/main/resources/assets/superbwarfare/textures/screens/shotgun_hud.png b/src/main/resources/assets/superbwarfare/textures/screens/shotgun_hud.png new file mode 100644 index 0000000000000000000000000000000000000000..1cc61f3f43247d8542f3b7dd6bbf4e01ccb4976c GIT binary patch literal 21758 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