From 6346b846639ae2e7e80ab38f271acbde477d2482 Mon Sep 17 00:00:00 2001 From: Light_Quanta Date: Thu, 10 Apr 2025 16:40:52 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E5=8F=96=E6=9B=B4=E5=A4=9ANBT?= =?UTF-8?q?=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/model/item/K98ItemModel.java | 3 +- .../client/model/item/MarlinItemModel.java | 3 +- .../client/model/item/RpgItemModel.java | 4 +- .../model/item/TracheliumItemModel.java | 2 +- .../client/overlay/AmmoBarOverlay.java | 6 +- .../renderer/item/BocekItemRenderer.java | 3 +- .../client/renderer/item/RpgItemRenderer.java | 4 +- .../event/ClientEventHandler.java | 12 +- .../superbwarfare/event/GunEventHandler.java | 350 +++++++----------- .../event/LivingEventHandler.java | 44 +-- .../event/PlayerEventHandler.java | 13 +- .../superbwarfare/item/gun/GunItem.java | 18 +- .../superbwarfare/item/gun/data/Charge.java | 38 +- .../superbwarfare/item/gun/data/GunData.java | 110 +++++- .../superbwarfare/item/gun/data/Reload.java | 41 +- .../superbwarfare/item/gun/data/Starter.java | 45 +++ .../superbwarfare/item/gun/data/Timer.java | 37 ++ .../item/gun/handgun/Glock17Item.java | 9 + .../item/gun/handgun/Glock18Item.java | 9 + .../item/gun/handgun/M1911Item.java | 9 + .../item/gun/handgun/Mp443Item.java | 9 + .../item/gun/handgun/Trachelium.java | 2 +- .../item/gun/launcher/JavelinItem.java | 8 +- .../item/gun/launcher/M79Item.java | 10 +- .../item/gun/launcher/RpgItem.java | 26 +- .../item/gun/launcher/SecondaryCataclysm.java | 17 +- .../item/gun/machinegun/M60Item.java | 9 + .../item/gun/rifle/MarlinItem.java | 7 +- .../item/gun/rifle/Mk14Item.java | 9 + .../item/gun/rifle/Qbz95Item.java | 9 + .../superbwarfare/item/gun/rifle/SksItem.java | 9 + .../item/gun/shotgun/M870Item.java | 10 +- .../item/gun/sniper/K98Item.java | 8 +- .../item/gun/sniper/MosinNagantItem.java | 7 +- .../item/gun/sniper/SvdItem.java | 9 + .../item/gun/special/BocekItem.java | 2 +- .../item/gun/special/TaserItem.java | 10 +- .../network/message/send/FireMessage.java | 5 +- .../network/message/send/FireModeMessage.java | 6 +- .../network/message/send/ReloadMessage.java | 12 +- .../network/message/send/ShootMessage.java | 8 +- 41 files changed, 567 insertions(+), 385 deletions(-) create mode 100644 src/main/java/com/atsuishio/superbwarfare/item/gun/data/Starter.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/item/gun/data/Timer.java diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/item/K98ItemModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/item/K98ItemModel.java index f92616a53..40259809f 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/model/item/K98ItemModel.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/item/K98ItemModel.java @@ -44,8 +44,7 @@ public class K98ItemModel extends GeoModel { if (!stack.is(ModTags.Items.GUN)) return; var data = GunData.from(stack); - final var tag = data.tag(); - if (tag.getDouble("PrepareTime") > 11 && data.ammo() == 1) { + if (data.reload.prepareTimer.get() > 11 && data.ammo() == 1) { clip.setScaleX(0); clip.setScaleY(0); clip.setScaleZ(0); diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/item/MarlinItemModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/item/MarlinItemModel.java index cb4c681fa..794b4c342 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/model/item/MarlinItemModel.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/item/MarlinItemModel.java @@ -6,7 +6,6 @@ import com.atsuishio.superbwarfare.event.ClientEventHandler; import com.atsuishio.superbwarfare.init.ModTags; import com.atsuishio.superbwarfare.item.gun.data.GunData; import com.atsuishio.superbwarfare.item.gun.rifle.MarlinItem; -import com.atsuishio.superbwarfare.tools.NBTTool; import net.minecraft.client.Minecraft; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; @@ -84,7 +83,7 @@ public class MarlinItemModel extends GeoModel { CrossHairOverlay.gunRot = shen.getRotZ(); - if (NBTTool.getTag(stack).getBoolean("IsEmpty")) { + if (GunData.from(stack).isEmpty()) { jichui.setRotX(-0.52f); } diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/item/RpgItemModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/item/RpgItemModel.java index c755ae7cd..22cf8d1db 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/model/item/RpgItemModel.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/item/RpgItemModel.java @@ -7,7 +7,6 @@ import com.atsuishio.superbwarfare.event.ClientEventHandler; import com.atsuishio.superbwarfare.init.ModTags; import com.atsuishio.superbwarfare.item.gun.data.GunData; import com.atsuishio.superbwarfare.item.gun.launcher.RpgItem; -import com.atsuishio.superbwarfare.tools.GunsTool; import net.minecraft.client.Minecraft; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; @@ -46,8 +45,7 @@ public class RpgItemModel extends GeoModel { if (!stack.is(ModTags.Items.GUN)) return; var data = GunData.from(stack); - var tag = data.tag(); - if (GunsTool.getGunBooleanTag(tag, "CloseHammer")) { + if (data.closeHammer()) { hammer.setRotX(-90 * Mth.DEG_TO_RAD); } diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/item/TracheliumItemModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/item/TracheliumItemModel.java index e1047a1c5..3d21f9096 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/model/item/TracheliumItemModel.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/item/TracheliumItemModel.java @@ -169,7 +169,7 @@ public class TracheliumItemModel extends GeoModel { GeoBone root = getAnimationProcessor().getBone("root"); root.setPosX((float) (movePosX + 20 * ClientEventHandler.drawTime + 9.3f * mph)); root.setPosY((float) (swayY + movePosY - 40 * ClientEventHandler.drawTime - 2f * vY)); - root.setPosZ(!NBTTool.getTag(stack).getBoolean("DA") && !NBTTool.getTag(stack).getBoolean("canImmediatelyShoot") ? 0.2f * (float) ClientEventHandler.revolverPreTime : 0); + root.setPosZ(!GunData.from(stack).DA() && !GunData.from(stack).canImmediatelyShoot() ? 0.2f * (float) ClientEventHandler.revolverPreTime : 0); root.setRotX((float) ((swayX - Mth.DEG_TO_RAD * 60 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotX - 0.15f * vY))); root.setRotY((float) (0.2f * movePosX + Mth.DEG_TO_RAD * 300 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotY)); root.setRotZ((float) (0.2f * movePosX + moveRotZ + Mth.DEG_TO_RAD * 90 * ClientEventHandler.drawTime + 2.7f * mph + Mth.DEG_TO_RAD * turnRotZ)); diff --git a/src/main/java/com/atsuishio/superbwarfare/client/overlay/AmmoBarOverlay.java b/src/main/java/com/atsuishio/superbwarfare/client/overlay/AmmoBarOverlay.java index 1f7aaf684..a4732bc33 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/overlay/AmmoBarOverlay.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/overlay/AmmoBarOverlay.java @@ -52,7 +52,7 @@ public class AmmoBarOverlay implements LayeredDraw.Layer { } if (stack.getItem() == ModItems.BOCEK.get()) { - return GunData.from(stack).data().getInt("MaxAmmo"); + return GunData.from(stack).maxAmmo(); } return GunData.from(stack).ammo(); @@ -69,7 +69,7 @@ public class AmmoBarOverlay implements LayeredDraw.Layer { if (!hasCreativeAmmo()) { var data = GunData.from(stack); if (stack.is(ModTags.Items.LAUNCHER) || stack.getItem() == ModItems.TASER.get()) { - return "" + data.data().getInt("MaxAmmo"); + return "" + data.maxAmmo(); } if (stack.is(ModTags.Items.USE_RIFLE_AMMO)) { return "" + cap.rifleAmmo; @@ -175,7 +175,7 @@ public class AmmoBarOverlay implements LayeredDraw.Layer { } else { guiGraphics.drawString( Minecraft.getInstance().font, - tag.getBoolean("DA") ? Component.translatable("des.superbwarfare.revolver.sa").withStyle(ChatFormatting.BOLD) : Component.translatable("des.superbwarfare.revolver.da").withStyle(ChatFormatting.BOLD), + data.DA() ? Component.translatable("des.superbwarfare.revolver.sa").withStyle(ChatFormatting.BOLD) : Component.translatable("des.superbwarfare.revolver.da").withStyle(ChatFormatting.BOLD), w - 96, h - 20, 0xFFFFFF, diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/BocekItemRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/BocekItemRenderer.java index 7de0682ac..fffb67d8e 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/BocekItemRenderer.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/BocekItemRenderer.java @@ -4,6 +4,7 @@ import com.atsuishio.superbwarfare.client.AnimationHelper; import com.atsuishio.superbwarfare.client.model.item.BocekItemModel; import com.atsuishio.superbwarfare.event.ClientEventHandler; import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.data.GunData; import com.atsuishio.superbwarfare.item.gun.special.BocekItem; import com.atsuishio.superbwarfare.tools.GunsTool; import com.atsuishio.superbwarfare.tools.NBTTool; @@ -90,7 +91,7 @@ public class BocekItemRenderer extends GeoItemRenderer { } if (name.equals("jian")) { - bone.setHidden(GunsTool.getGunIntTag(tag, "MaxAmmo") == 0); + bone.setHidden(GunData.from(itemStack).maxAmmo() == 0); } if (renderingArms) { diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/RpgItemRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/RpgItemRenderer.java index a0fda4074..b0316c223 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/RpgItemRenderer.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/RpgItemRenderer.java @@ -4,8 +4,8 @@ import com.atsuishio.superbwarfare.client.AnimationHelper; import com.atsuishio.superbwarfare.client.model.item.RpgItemModel; import com.atsuishio.superbwarfare.event.ClientEventHandler; import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.data.GunData; import com.atsuishio.superbwarfare.item.gun.launcher.RpgItem; -import com.atsuishio.superbwarfare.tools.NBTTool; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import net.minecraft.client.Minecraft; @@ -78,7 +78,7 @@ public class RpgItemRenderer extends GeoItemRenderer { if (!itemStack.is(ModTags.Items.GUN)) return; if (name.equals("Rockets")) { - bone.setHidden(NBTTool.getTag(itemStack).getBoolean("IsEmpty")); + bone.setHidden(GunData.from(itemStack).isEmpty()); } if (name.equals("flare")) { diff --git a/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java b/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java index 744ae8a3e..e864392c8 100644 --- a/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java @@ -187,13 +187,13 @@ public class ClientEventHandler { return player.getVehicle() instanceof VehicleEntity vehicle && vehicle.allowFreeCam() && Minecraft.getInstance().options.getCameraType() == CameraType.FIRST_PERSON && ModKeyMappings.FREE_CAMERA.isDown(); } - private static boolean revolverPre(final CompoundTag tag) { + private static boolean revolverPre(GunData data) { Player player = Minecraft.getInstance().player; if (player == null) return false; ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.REVOLVER)) { return true; - } else if (stack.is(ModTags.Items.REVOLVER) && (tag.getBoolean("DA") || tag.getBoolean("canImmediatelyShoot"))) { + } else if (stack.is(ModTags.Items.REVOLVER) && (data.DA() || data.canImmediatelyShoot())) { return true; } else { return revolverPreTime >= 1; @@ -456,11 +456,11 @@ public class ClientEventHandler { int cooldown = (int) (1000 / rps); //左轮类 - if (clientTimer.getProgress() == 0 && stack.is(ModTags.Items.REVOLVER) && ((holdFire && !tag.getBoolean("DA")) - || (data.bolt.actionTime() < 7 && data.bolt.actionTime() > 2) || tag.getBoolean("canImmediatelyShoot"))) { + if (clientTimer.getProgress() == 0 && stack.is(ModTags.Items.REVOLVER) && ((holdFire && !data.DA()) + || (data.bolt.actionTime() < 7 && data.bolt.actionTime() > 2) || data.canImmediatelyShoot())) { revolverPreTime = Mth.clamp(revolverPreTime + 0.3 * times, 0, 1); revolverWheelPreTime = Mth.clamp(revolverWheelPreTime + 0.32 * times, 0, revolverPreTime > 0.7 ? 1 : 0.55); - } else if (!tag.getBoolean("DA") && !tag.getBoolean("canImmediatelyShoot")) { + } else if (!data.DA() && !data.canImmediatelyShoot()) { revolverPreTime = Mth.clamp(revolverPreTime - 1.2 * times, 0, 1); } @@ -480,7 +480,7 @@ public class ClientEventHandler { && data.ammo() > 0 && !player.getCooldowns().isOnCooldown(stack.getItem()) && !data.bolt.needed() - && revolverPre(tag)) + && revolverPre(data)) || (stack.is(ModItems.MINIGUN.get()) && !player.isSprinting() && tag.getDouble("overheat") == 0 diff --git a/src/main/java/com/atsuishio/superbwarfare/event/GunEventHandler.java b/src/main/java/com/atsuishio/superbwarfare/event/GunEventHandler.java index 2faa983e3..264c78391 100644 --- a/src/main/java/com/atsuishio/superbwarfare/event/GunEventHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/event/GunEventHandler.java @@ -16,7 +16,6 @@ import com.atsuishio.superbwarfare.tools.InventoryTool; import com.atsuishio.superbwarfare.tools.SoundTool; import net.minecraft.core.Holder; import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.nbt.CompoundTag; import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundEvent; import net.minecraft.world.effect.MobEffect; @@ -42,10 +41,10 @@ public class GunEventHandler { ItemStack stack = player.getMainHandItem(); - if (stack.is(ModTags.Items.GUN)) { + if (stack.getItem() instanceof GunItem) { var data = GunData.from(stack); - handleGunBolt(player, data); + handleGunBolt(data); handleGunReload(player, data); handleGunSingleReload(player, data); handleSentinelCharge(player, data); @@ -57,24 +56,22 @@ public class GunEventHandler { /** * 拉大栓 */ - private static void handleGunBolt(Player player, GunData data) { - ItemStack stack = player.getMainHandItem(); + private static void handleGunBolt(GunData data) { + var stack = data.stack(); if (stack.is(ModTags.Items.NORMAL_GUN)) { - var tag = data.tag(); - if (data.bolt.actionTime() > 0) { data.bolt.reduceActionTime(); } if (stack.getItem() == ModItems.MARLIN.get() && data.bolt.actionTime() == 9) { - tag.remove("IsEmpty"); + data.setIsEmpty(false); } if (data.bolt.actionTime() == 1) { data.bolt.markNeedless(); if (stack.is(ModTags.Items.REVOLVER)) { - tag.putBoolean("canImmediatelyShoot", true); + data.setCanImmediatelyShoot(true); } } } @@ -172,14 +169,13 @@ public class GunEventHandler { } } - public static void gunShoot(Player player, final CompoundTag tag, double spared) { - ItemStack stack = player.getMainHandItem(); - var data = GunData.from(stack); + public static void gunShoot(Player player, GunData data, double spared) { + var stack = data.stack(); if (!player.level().isClientSide()) { float headshot = (float) data.headshot(); float damage = (float) data.damage(); - float velocity = (float) ((data.velocity() + GunsTool.getGunDoubleTag(tag, "CustomVelocity")) * perkSpeed(data)); + float velocity = (float) (data.velocity() * perkSpeed(data)); int projectileAmount = data.projectileAmount(); float bypassArmorRate = (float) data.bypassArmor(); boolean zoom = player.getData(ModAttachments.PLAYER_VARIABLE).zoom; @@ -265,87 +261,50 @@ public class GunEventHandler { /** * 通用的武器换弹流程 */ - private static void handleGunReload(Player player, GunData gunData) { - ItemStack stack = player.getMainHandItem(); - if (!(stack.getItem() instanceof GunItem gunItem)) return; - - var tag = gunData.tag(); - var data = gunData.data(); + private static void handleGunReload(Player player, GunData gun) { + var stack = gun.stack(); + var gunItem = gun.item(); + var reload = gun.reload; // 启动换弹 - if (gunData.reload.shouldStart()) { - + if (reload.reloadStarter.start()) { NeoForge.EVENT_BUS.post(new ReloadEvent.Pre(player, stack)); + if (gunItem.isOpenBolt(stack)) { - if (gunData.ammo() == 0) { - gunData.reload.setTime(gunData.emptyReloadTime() + 1); - gunData.reload.setState(ReloadState.EMPTY_RELOADING); + if (gun.ammo() == 0) { + reload.setTime(gun.defaultEmptyReloadTime() + 1); + reload.setState(ReloadState.EMPTY_RELOADING); playGunEmptyReloadSounds(player); } else { - gunData.reload.setTime(gunData.normalReloadTime() + 1); - gunData.reload.setState(ReloadState.NORMAL_RELOADING); + reload.setTime(gun.defaultNormalReloadTime() + 1); + reload.setState(ReloadState.NORMAL_RELOADING); playGunNormalReloadSounds(player); } } else { - gunData.reload.setTime(gunData.emptyReloadTime() + 2); - gunData.reload.setState(ReloadState.EMPTY_RELOADING); + reload.setTime(gun.defaultEmptyReloadTime() + 2); + reload.setState(ReloadState.EMPTY_RELOADING); playGunEmptyReloadSounds(player); } - gunData.reload.markStarted(); } - gunData.reload.reduce(); + reload.reduce(); - if (stack.getItem() == ModItems.RPG.get()) { - if (gunData.reload.time() == 84) { - tag.remove("IsEmpty"); - } - if (gunData.reload.time() == 9) { - data.remove("CloseHammer"); - } + var behavior = gunItem.reloadTimeBehaviors.get(reload.time()); + if (behavior != null) { + behavior.accept(gun); } - if (stack.getItem() == ModItems.MK_14.get() && gunData.reload.time() == 18) { - data.remove("HoldOpen"); - } - - if (stack.getItem() == ModItems.SVD.get() && gunData.reload.time() == 17) { - data.remove("HoldOpen"); - } - - if (stack.getItem() == ModItems.SKS.get() && gunData.reload.time() == 14) { - data.remove("HoldOpen"); - } - - if (stack.getItem() == ModItems.M_60.get() && gunData.reload.time() == 55) { - data.remove("HideBulletChain"); - } - - if (stack.getItem() == ModItems.GLOCK_17.get() - || stack.getItem() == ModItems.GLOCK_18.get() - || stack.getItem() == ModItems.M_1911.get() - || stack.getItem() == ModItems.MP_443.get() - ) { - if (gunData.reload.time() == 9) { - data.remove("HoldOpen"); - } - } - - if (stack.getItem() == ModItems.QBZ_95.get() && gunData.reload.time() == 14) { - data.remove("HoldOpen"); - } - - if (gunData.reload.time() == 1) { + if (reload.time() == 1) { if (gunItem.isOpenBolt(stack)) { - if (gunData.ammo() == 0) { - playGunEmptyReload(player, gunData); + if (gun.ammo() == 0) { + playGunEmptyReload(player, gun); } else { - playGunNormalReload(player, gunData); + playGunNormalReload(player, gun); } } else { - playGunEmptyReload(player, gunData); + playGunEmptyReload(player, gun); } - gunData.reload.markStarted(); + reload.reloadStarter.finish(); } } @@ -372,45 +331,35 @@ public class GunEventHandler { NeoForge.EVENT_BUS.post(new ReloadEvent.Post(player, stack)); } - public static void playGunEmptyReload(Player player, GunData gunData) { - ItemStack stack = gunData.stack(); + public static void playGunEmptyReload(Player player, GunData data) { + ItemStack stack = data.stack(); if (player.getInventory().hasAnyMatching(item -> item.is(ModItems.CREATIVE_AMMO_BOX.get()))) { - gunData.setAmmo(gunData.magazine()); + data.setAmmo(data.magazine()); } else { if (stack.is(ModTags.Items.USE_SHOTGUN_AMMO)) { - GunsTool.reload(player, stack, gunData, AmmoType.SHOTGUN); + GunsTool.reload(player, stack, data, AmmoType.SHOTGUN); } else if (stack.is(ModTags.Items.USE_SNIPER_AMMO)) { - GunsTool.reload(player, stack, gunData, AmmoType.SNIPER); + GunsTool.reload(player, stack, data, AmmoType.SNIPER); } else if (stack.is(ModTags.Items.USE_HANDGUN_AMMO)) { - GunsTool.reload(player, stack, gunData, AmmoType.HANDGUN); + GunsTool.reload(player, stack, data, AmmoType.HANDGUN); } else if (stack.is(ModTags.Items.USE_RIFLE_AMMO)) { - GunsTool.reload(player, stack, gunData, AmmoType.RIFLE); + GunsTool.reload(player, stack, data, AmmoType.RIFLE); } else if (stack.is(ModTags.Items.USE_HEAVY_AMMO)) { - GunsTool.reload(player, stack, gunData, AmmoType.HEAVY); - } else if (stack.getItem() == ModItems.TASER.get()) { - gunData.setAmmo(1); - player.getInventory().clearOrCountMatchingItems(p -> p.getItem() == ModItems.TASER_ELECTRODE.get(), 1, player.inventoryMenu.getCraftSlots()); - } else if (stack.getItem() == ModItems.M_79.get()) { - gunData.setAmmo(1); - player.getInventory().clearOrCountMatchingItems(p -> p.getItem() == ModItems.GRENADE_40MM.get(), 1, player.inventoryMenu.getCraftSlots()); - } else if (stack.getItem() == ModItems.RPG.get()) { - gunData.setAmmo(1); - player.getInventory().clearOrCountMatchingItems(p -> p.getItem() == ModItems.ROCKET.get(), 1, player.inventoryMenu.getCraftSlots()); - } else if (stack.getItem() == ModItems.JAVELIN.get()) { - gunData.setAmmo(1); - player.getInventory().clearOrCountMatchingItems(p -> p.getItem() == ModItems.JAVELIN_MISSILE.get(), 1, player.inventoryMenu.getCraftSlots()); + GunsTool.reload(player, stack, data, AmmoType.HEAVY); + } else if (data.item().getCustomAmmoItem() != null) { + var ammoItem = data.item().getCustomAmmoItem(); + data.setAmmo(1); + player.getInventory().clearOrCountMatchingItems(p -> p.getItem() == ammoItem, 1, player.inventoryMenu.getCraftSlots()); } } - gunData.reload.setState(ReloadState.NOT_RELOADING); + data.reload.setState(ReloadState.NOT_RELOADING); NeoForge.EVENT_BUS.post(new ReloadEvent.Post(player, stack)); } public static void playGunEmptyReloadSounds(Player player) { ItemStack stack = player.getMainHandItem(); - if (!stack.is(ModTags.Items.GUN)) { - return; - } + if (!stack.is(ModTags.Items.GUN)) return; if (!player.level().isClientSide) { String origin = stack.getItem().getDescriptionId(); @@ -445,151 +394,130 @@ public class GunEventHandler { /** * 单发装填类的武器换弹流程 */ - private static void handleGunSingleReload(Player player, GunData gunData) { - ItemStack stack = player.getMainHandItem(); - if (!(stack.getItem() instanceof GunItem)) return; - var tag = gunData.tag(); + private static void handleGunSingleReload(Player player, GunData data) { + var stack = data.stack(); + var reload = data.reload; // 换弹流程计时器 - if (tag.getDouble("PrepareTime") > 0) { - tag.putDouble("PrepareTime", tag.getDouble("PrepareTime") - 1); - } - if (tag.getDouble("PrepareLoadTime") > 0) { - tag.putDouble("PrepareLoadTime", tag.getDouble("PrepareLoadTime") - 1); - } - if (tag.getDouble("IterativeLoadTime") > 0) { - tag.putDouble("IterativeLoadTime", tag.getDouble("IterativeLoadTime") - 1); - } - if (tag.getDouble("FinishTime") > 0) { - tag.putDouble("FinishTime", tag.getDouble("FinishTime") - 1); - } + reload.prepareTimer.reduce(); + reload.prepareLoadTimer.reduce(); + reload.iterativeLoadTimer.reduce(); + reload.finishTimer.reduce(); -// player.displayClientMessage(Component.literal("prepare: " + new DecimalFormat("##.#").format(tag.getDouble("PrepareTime")) -// + " prepare_load: " + new DecimalFormat("##.#").format(tag.getDouble("PrepareLoadTime")) +// player.displayClientMessage(Component.literal("prepare: " + new DecimalFormat("##.#").format(data.reload.prepareTimer.get()) +// + " prepare_load: " + new DecimalFormat("##.#").format(data.reload.iterativeLoadTimer.get()) // + " iterative: " + new DecimalFormat("##.#").format(tag.getDouble("IterativeLoadTime")) // + " finish: " + new DecimalFormat("##.#").format(tag.getDouble("FinishTime")) // + " reload_stage: " + new DecimalFormat("##.#").format(tag.getDouble("reload_stage")) // ), true); // 一阶段 - if (tag.getBoolean("StartSingleReload")) { + if (reload.singleReloadStarter.start()) { NeoForge.EVENT_BUS.post(new ReloadEvent.Pre(player, stack)); - if ((gunData.prepareLoadTime() != 0 && gunData.ammo() == 0) || stack.is(ModItems.SECONDARY_CATACLYSM.get())) { + if ((data.defaultPrepareLoadTime() != 0 && data.ammo() == 0) || stack.is(ModItems.SECONDARY_CATACLYSM.get())) { // 此处判断空仓换弹的时候,是否在准备阶段就需要装填一发,如M870 playGunPrepareLoadReloadSounds(player); - int prepareLoadTime = gunData.prepareLoadTime(); - tag.putInt("PrepareLoadTime", prepareLoadTime + 1); + int prepareLoadTime = data.defaultPrepareLoadTime(); + reload.prepareLoadTimer.set(prepareLoadTime + 1); player.getCooldowns().addCooldown(stack.getItem(), prepareLoadTime); - } else if (gunData.prepareEmptyTime() != 0 && gunData.ammo() == 0) { + } else if (data.defaultPrepareEmptyTime() != 0 && data.ammo() == 0) { // 此处判断空仓换弹,如莫辛纳甘 playGunEmptyPrepareSounds(player); - int prepareEmptyTime = gunData.prepareEmptyTime(); - tag.putInt("PrepareTime", prepareEmptyTime + 1); + int prepareEmptyTime = data.defaultPrepareEmptyTime(); + reload.prepareTimer.set(prepareEmptyTime + 1); player.getCooldowns().addCooldown(stack.getItem(), prepareEmptyTime); } else { playGunPrepareReloadSounds(player); - int prepareTime = gunData.prepareTime(); - tag.putInt("PrepareTime", prepareTime + 1); + int prepareTime = data.defaultPrepareTime(); + reload.prepareTimer.set(prepareTime + 1); player.getCooldowns().addCooldown(stack.getItem(), prepareTime); } - tag.remove("ForceStop"); - tag.remove("Stopped"); - gunData.reload.setStage(1); - gunData.reload.setState(ReloadState.NORMAL_RELOADING); - tag.remove("StartSingleReload"); + data.setForceStop(false); + data.setStopped(false); + reload.setStage(1); + reload.setState(ReloadState.NORMAL_RELOADING); } - if (stack.getItem() == ModItems.M_870.get() && tag.getInt("PrepareLoadTime") == 10) { - singleLoad(player, gunData); + if (stack.getItem() == ModItems.M_870.get() && reload.prepareLoadTimer.get() == 10) { + singleLoad(player, data); } - if (stack.getItem() == ModItems.SECONDARY_CATACLYSM.get() && tag.getInt("PrepareLoadTime") == 3) { - singleLoad(player, gunData); + if (stack.getItem() == ModItems.SECONDARY_CATACLYSM.get() && reload.prepareLoadTimer.get() == 3) { + singleLoad(player, data); } // 一阶段结束,检查备弹,如果有则二阶段启动,无则直接跳到三阶段 - if ((tag.getDouble("PrepareTime") == 1 || tag.getDouble("PrepareLoadTime") == 1)) { + if ((reload.prepareTimer.get() == 1 || reload.prepareLoadTimer.get() == 1)) { if (!InventoryTool.hasCreativeAmmoBox(player)) { var capability = player.getData(ModAttachments.PLAYER_VARIABLE); - if (stack.is(ModTags.Items.USE_SHOTGUN_AMMO) && capability.shotgunAmmo == 0) { - tag.putBoolean("ForceStartStage3", true); - } else if (stack.is(ModTags.Items.USE_SNIPER_AMMO) && capability.sniperAmmo == 0) { - tag.putBoolean("ForceStartStage3", true); - } else if ((stack.is(ModTags.Items.USE_HANDGUN_AMMO) || stack.is(ModTags.Items.SMG)) && capability.handgunAmmo == 0) { - tag.putBoolean("ForceStartStage3", true); - } else if (stack.is(ModTags.Items.USE_RIFLE_AMMO) && capability.rifleAmmo == 0) { - tag.putBoolean("ForceStartStage3", true); - } else if (stack.is(ModTags.Items.USE_HEAVY_AMMO) && capability.heavyAmmo == 0) { - tag.putBoolean("ForceStartStage3", true); - } else if (stack.is(ModTags.Items.LAUNCHER) && GunsTool.getGunIntTag(tag, "MaxAmmo") == 0) { - tag.putBoolean("ForceStartStage3", true); - } else if (stack.is(ModItems.SECONDARY_CATACLYSM.get()) && gunData.ammo() >= gunData.magazine()) { - tag.putBoolean("ForceStartStage3", true); + if (stack.is(ModTags.Items.USE_SHOTGUN_AMMO) && capability.shotgunAmmo == 0 + || stack.is(ModTags.Items.USE_SNIPER_AMMO) && capability.sniperAmmo == 0 + || stack.is(ModTags.Items.USE_HANDGUN_AMMO) && capability.handgunAmmo == 0 + || stack.is(ModTags.Items.USE_RIFLE_AMMO) && capability.rifleAmmo == 0 + || stack.is(ModTags.Items.USE_HEAVY_AMMO) && capability.heavyAmmo == 0 + || stack.is(ModTags.Items.LAUNCHER) && data.maxAmmo() == 0 + || stack.is(ModItems.SECONDARY_CATACLYSM.get()) && data.ammo() >= data.magazine() + ) { + reload.stage3Starter.markStart(); } else { - gunData.reload.setStage(2); + reload.setStage(2); } } else { - if (stack.is(ModItems.SECONDARY_CATACLYSM.get()) && gunData.ammo() >= gunData.magazine()) { - tag.putBoolean("ForceStartStage3", true); + if (stack.is(ModItems.SECONDARY_CATACLYSM.get()) && data.ammo() >= data.magazine()) { + reload.stage3Starter.markStart(); } else { - gunData.reload.setStage(2); + reload.setStage(2); } } // 检查备弹 } // 强制停止换弹,进入三阶段 - if (tag.getBoolean("ForceStop") && gunData.reload.stage() == 2 && tag.getInt("IterativeLoadTime") > 0) { - tag.putBoolean("Stopped", true); + if (data.forceStop() && reload.stage() == 2 && reload.iterativeLoadTimer.get() > 0) { + data.setForceStop(true); } // 二阶段 - if ((tag.getDouble("PrepareTime") == 0 || tag.getDouble("PrepareLoadTime") == 0) - && gunData.reload.stage() == 2 - && tag.getInt("IterativeLoadTime") == 0 - && !tag.getBoolean("Stopped") - && gunData.ammo() < gunData.magazine() + if ((reload.prepareTimer.get() == 0 || reload.iterativeLoadTimer.get() == 0) + && reload.stage() == 2 + && reload.iterativeLoadTimer.get() == 0 + && !data.stopped() + && data.ammo() < data.magazine() ) { - playGunLoopReloadSounds(player); - int iterativeTime = gunData.iterativeTime(); - tag.putDouble("IterativeLoadTime", iterativeTime); + int iterativeTime = data.defaultIterativeTime(); + reload.iterativeLoadTimer.set(iterativeTime); player.getCooldowns().addCooldown(stack.getItem(), iterativeTime); // 动画播放nbt - if (tag.getDouble("LoadIndex") == 1) { - tag.putDouble("LoadIndex", 0); - } else { - tag.putDouble("LoadIndex", 1); - } + data.setLoadIndex(data.loadIndex() == 1 ? 0 : 1); } // 装填 if ((stack.getItem() == ModItems.M_870.get() || stack.getItem() == ModItems.MARLIN.get()) - && tag.getInt("IterativeLoadTime") == 3 + && reload.iterativeLoadTimer.get() == 3 ) { - singleLoad(player, gunData); + singleLoad(player, data); } - if (stack.getItem() == ModItems.SECONDARY_CATACLYSM.get() && tag.getInt("IterativeLoadTime") == 16) { - singleLoad(player, gunData); + if (stack.getItem() == ModItems.SECONDARY_CATACLYSM.get() && reload.iterativeLoadTimer.get() == 16) { + singleLoad(player, data); } - if ((stack.getItem() == ModItems.K_98.get() - || stack.getItem() == ModItems.MOSIN_NAGANT.get()) - && tag.getInt("IterativeLoadTime") == 1 + if ((stack.getItem() == ModItems.K_98.get() || stack.getItem() == ModItems.MOSIN_NAGANT.get()) + && reload.iterativeLoadTimer.get() == 1 ) { - singleLoad(player, gunData); + singleLoad(player, data); } // 二阶段结束 - if (tag.getInt("IterativeLoadTime") == 1) { + if (reload.iterativeLoadTimer.get() == 1) { // 装满结束 - if (gunData.ammo() >= gunData.magazine()) { - gunData.reload.setStage(3); + if (data.ammo() >= data.magazine()) { + reload.setStage(3); } // 备弹耗尽结束 @@ -597,48 +525,50 @@ public class GunEventHandler { var capability = player.getData(ModAttachments.PLAYER_VARIABLE); if (stack.is(ModTags.Items.USE_SHOTGUN_AMMO) && capability.shotgunAmmo == 0) { - gunData.reload.setStage(3); + reload.setStage(3); } else if (stack.is(ModTags.Items.USE_SNIPER_AMMO) && capability.sniperAmmo == 0) { - gunData.reload.setStage(3); - } else if ((stack.is(ModTags.Items.USE_HANDGUN_AMMO) || stack.is(ModTags.Items.SMG)) && capability.handgunAmmo == 0) { - gunData.reload.setStage(3); + reload.setStage(3); + } else if (stack.is(ModTags.Items.USE_HANDGUN_AMMO) && capability.handgunAmmo == 0) { + reload.setStage(3); } else if (stack.is(ModTags.Items.USE_RIFLE_AMMO) && capability.rifleAmmo == 0) { - gunData.reload.setStage(3); + reload.setStage(3); } else if (stack.is(ModTags.Items.USE_HEAVY_AMMO) && capability.heavyAmmo == 0) { - gunData.reload.setStage(3); + reload.setStage(3); } } // 强制结束 - if (tag.getBoolean("Stopped")) { - gunData.reload.setStage(3); - tag.remove("ForceStop"); - tag.remove("Stopped"); + if (data.stopped()) { + reload.setStage(3); + data.setStopped(false); + data.setForceStop(false); } } // 三阶段 - if ((tag.getInt("IterativeLoadTime") == 1 && gunData.reload.stage() == 3) || tag.getBoolean("ForceStartStage3")) { - gunData.reload.setStage(3); - tag.remove("ForceStartStage3"); - int finishTime = gunData.finishTime(); - tag.putInt("FinishTime", finishTime + 2); + if ((reload.iterativeLoadTimer.get() == 1 && reload.stage() == 3) || reload.stage3Starter.shouldStart()) { + reload.setStage(3); + reload.stage3Starter.finish(); + + int finishTime = data.defaultFinishTime(); + reload.finishTimer.set(finishTime + 2); player.getCooldowns().addCooldown(stack.getItem(), finishTime + 2); + playGunEndReloadSounds(player); } - if (stack.getItem() == ModItems.MARLIN.get() && tag.getInt("FinishTime") == 10) { - tag.remove("IsEmpty"); + if (stack.getItem() == ModItems.MARLIN.get() && reload.finishTimer.get() == 10) { + data.setIsEmpty(false); } // 三阶段结束 - if (tag.getInt("FinishTime") == 1) { - gunData.reload.setStage(0); - if (gunData.bolt.defaultActionTime() > 0) { - gunData.bolt.markNeedless(); + if (reload.finishTimer.get() == 1) { + reload.setStage(0); + if (data.bolt.defaultActionTime() > 0) { + data.bolt.markNeedless(); } - gunData.reload.setState(ReloadState.NOT_RELOADING); - tag.remove("StartSingleReload"); + reload.setState(ReloadState.NOT_RELOADING); + reload.singleReloadStarter.finish(); NeoForge.EVENT_BUS.post(new ReloadEvent.Post(player, stack)); } @@ -662,7 +592,7 @@ public class GunEventHandler { } else if (stack.is(ModTags.Items.USE_HEAVY_AMMO)) { AmmoType.HEAVY.add(cap, -1); } else if (stack.getItem() == ModItems.SECONDARY_CATACLYSM.get()) { - player.getInventory().clearOrCountMatchingItems(p -> p.getItem() == ModItems.GRENADE_40MM.get(), 1, player.inventoryMenu.getCraftSlots()); + player.getInventory().clearOrCountMatchingItems(p -> p.getItem() == data.item().getCustomAmmoItem(), 1, player.inventoryMenu.getCraftSlots()); } player.setData(ModAttachments.PLAYER_VARIABLE, cap); @@ -700,7 +630,7 @@ public class GunEventHandler { double shooterHeight = player.getEyePosition().distanceTo((Vec3.atLowerCornerOf(player.level().clip(new ClipContext(player.getEyePosition(), player.getEyePosition().add(new Vec3(0, -1, 0).scale(10)), ClipContext.Block.OUTLINE, ClipContext.Fluid.NONE, player)).getBlockPos()))); - Mod.queueServerWork((int) (data.prepareEmptyTime() / 2 + 3 + 1.5 * shooterHeight), () -> { + Mod.queueServerWork((int) (data.defaultPrepareEmptyTime() / 2 + 3 + 1.5 * shooterHeight), () -> { if (stack.is(ModTags.Items.SHOTGUN)) { SoundTool.playLocalSound(serverPlayer, ModSounds.SHELL_CASING_SHOTGUN.get(), (float) Math.max(0.75 - 0.12 * shooterHeight, 0), 1); } else if (stack.is(ModTags.Items.SNIPER_RIFLE) || stack.is(ModTags.Items.HEAVY_WEAPON)) { @@ -784,25 +714,19 @@ public class GunEventHandler { * 哨兵充能 */ private static void handleSentinelCharge(Player player, GunData data) { - if (!(player.getMainHandItem().getItem() instanceof GunItem)) return; - // 启动充能 - if (data.charge.shouldStartCharge()) { - data.charge.setTime(127); + if (data.charge.starter.start()) { + data.charge.timer.set(127); SoundEvent sound1p = BuiltInRegistries.SOUND_EVENT.get(Mod.loc("sentinel_charge")); if (sound1p != null && player instanceof ServerPlayer serverPlayer) { SoundTool.playLocalSound(serverPlayer, sound1p, 2f, 1f); } - - data.charge.markStarted(); } - if (data.charge.time() > 0) { - data.charge.reduce(); - } + data.charge.timer.reduce(); - if (data.charge.time() == 17) { + if (data.charge.timer.get() == 17) { for (var cell : player.getInventory().items) { if (cell.is(ModItems.CELL.get())) { var stackStorage = data.stack().getCapability(Capabilities.EnergyStorage.ITEM); diff --git a/src/main/java/com/atsuishio/superbwarfare/event/LivingEventHandler.java b/src/main/java/com/atsuishio/superbwarfare/event/LivingEventHandler.java index fd04eab0a..80f33410a 100644 --- a/src/main/java/com/atsuishio/superbwarfare/event/LivingEventHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/event/LivingEventHandler.java @@ -348,38 +348,35 @@ public class LivingEventHandler { var newTag = NBTTool.getTag(newStack); if (player instanceof ServerPlayer serverPlayer && (newStack.getItem() != oldStack.getItem() - || (newStack.is(ModTags.Items.GUN) && !GunsTool.getGunData(newTag).hasUUID("UUID")) - || (oldStack.is(ModTags.Items.GUN) && !GunsTool.getGunData(oldTag).hasUUID("UUID")) + || (newStack.is(ModTags.Items.GUN) && !GunData.from(newStack).initialized()) + || (oldStack.is(ModTags.Items.GUN) && !GunData.from(oldStack).initialized()) || (newStack.is(ModTags.Items.GUN) && oldStack.is(ModTags.Items.GUN) && !Objects.equals(GunsTool.getGunUUID(newTag), GunsTool.getGunUUID(oldTag))) )) { if (oldStack.getItem() instanceof GunItem oldGun) { stopGunReloadSound(serverPlayer, oldGun); var oldData = GunData.from(oldStack); - oldTag = oldData.tag(); - var data = oldData.data(); if (oldData.bolt.defaultActionTime() > 0) { oldData.bolt.setActionTime(0); } oldData.reload.setTime(0); - oldTag.put("GunData", data); oldData.reload.setState(ReloadState.NOT_RELOADING); - if (oldData.iterativeTime() != 0) { - oldTag.remove("ForceStop"); - oldTag.remove("Stopped"); + if (oldData.defaultIterativeTime() != 0) { + oldData.setStopped(false); + oldData.setForceStop(false); oldData.reload.setStage(0); - oldTag.remove("PrepareTime"); - oldTag.remove("PrepareLoadTime"); - oldTag.remove("IterativeLoadTime"); - oldTag.remove("FinishTime"); + oldData.reload.prepareTimer.reset(); + oldData.reload.prepareLoadTimer.reset(); + oldData.reload.iterativeLoadTimer.reset(); + oldData.reload.finishTimer.reset(); } if (oldStack.is(ModItems.SENTINEL.get())) { - oldData.charge.reset(); + oldData.charge.timer.reset(); } var cap = player.getData(ModAttachments.PLAYER_VARIABLE).watch(); @@ -401,23 +398,20 @@ public class LivingEventHandler { } newData.reload.setState(ReloadState.NOT_RELOADING); + newData.reload.reloadTimer.reset(); - var data = newData.data(); - newData.reload.setTime(0); - newTag.put("GunData", data); - - if (newData.iterativeTime() != 0) { - newTag.remove("ForceStop"); - newTag.remove("Stopped"); + if (newData.defaultIterativeTime() != 0) { + newData.setForceStop(false); + newData.setStopped(false); newData.reload.setStage(0); - newTag.remove("PrepareTime"); - newTag.remove("PrepareLoadTime"); - newTag.remove("IterativeLoadTime"); - newTag.remove("FinishTime"); + newData.reload.prepareTimer.reset(); + newData.reload.prepareLoadTimer.reset(); + newData.reload.iterativeLoadTimer.reset(); + newData.reload.finishTimer.reset(); } if (newStack.is(ModItems.SENTINEL.get())) { - newData.charge.reset(); + newData.charge.timer.reset(); } int level = newData.perk.getLevel(ModPerks.KILLING_TALLY); diff --git a/src/main/java/com/atsuishio/superbwarfare/event/PlayerEventHandler.java b/src/main/java/com/atsuishio/superbwarfare/event/PlayerEventHandler.java index 3794f0958..9ea48a49f 100644 --- a/src/main/java/com/atsuishio/superbwarfare/event/PlayerEventHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/event/PlayerEventHandler.java @@ -205,10 +205,9 @@ public class PlayerEventHandler { ItemStack stack = player.getMainHandItem(); var data = GunData.from(stack); - var tag = data.tag(); if ((stack.is(ModItems.RPG.get()) || stack.is(ModItems.BOCEK.get())) && data.ammo() == 1) { - tag.remove("IsEmpty"); + data.setIsEmpty(false); } } @@ -222,7 +221,7 @@ public class PlayerEventHandler { if (cap.bowPullHold) { if (stack.getItem() == ModItems.BOCEK.get() - && GunsTool.getGunIntTag(tag, "MaxAmmo") > 0 + && data.maxAmmo() > 0 && !player.getCooldowns().isOnCooldown(stack.getItem()) && GunsTool.getGunDoubleTag(tag, "Power") < 12 ) { @@ -291,19 +290,19 @@ public class PlayerEventHandler { GunsTool.reload(player, stack, data, AmmoType.HEAVY); } - if (stack.getItem() == ModItems.TASER.get() && GunsTool.getGunIntTag(tag, "MaxAmmo") > 0 && data.ammo() == 0) { + if (stack.getItem() == ModItems.TASER.get() && data.maxAmmo() > 0 && data.ammo() == 0) { data.setAmmo(1); player.getInventory().clearOrCountMatchingItems(p -> p.getItem() == ModItems.TASER_ELECTRODE.get(), 1, player.inventoryMenu.getCraftSlots()); } - if (stack.getItem() == ModItems.M_79.get() && GunsTool.getGunIntTag(tag, "MaxAmmo") > 0 && data.ammo() == 0) { + if (stack.getItem() == ModItems.M_79.get() && data.maxAmmo() > 0 && data.ammo() == 0) { data.setAmmo(1); player.getInventory().clearOrCountMatchingItems(p -> p.getItem() == ModItems.GRENADE_40MM.get(), 1, player.inventoryMenu.getCraftSlots()); } - if (stack.getItem() == ModItems.RPG.get() && GunsTool.getGunIntTag(tag, "MaxAmmo") > 0 && data.ammo() == 0) { + if (stack.getItem() == ModItems.RPG.get() && data.maxAmmo() > 0 && data.ammo() == 0) { data.setAmmo(1); player.getInventory().clearOrCountMatchingItems(p -> p.getItem() == ModItems.ROCKET.get(), 1, player.inventoryMenu.getCraftSlots()); } - if (stack.getItem() == ModItems.JAVELIN.get() && GunsTool.getGunIntTag(tag, "MaxAmmo") > 0 && data.ammo() == 0) { + if (stack.getItem() == ModItems.JAVELIN.get() && data.maxAmmo() > 0 && data.ammo() == 0) { data.setAmmo(1); player.getInventory().clearOrCountMatchingItems(p -> p.getItem() == ModItems.JAVELIN_MISSILE.get(), 1, player.inventoryMenu.getCraftSlots()); } diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/GunItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/GunItem.java index fb3187479..03b834780 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/GunItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/GunItem.java @@ -39,15 +39,15 @@ import net.neoforged.neoforge.client.extensions.common.RegisterClientExtensionsE import org.jetbrains.annotations.NotNull; import javax.annotation.ParametersAreNonnullByDefault; -import java.util.ArrayList; -import java.util.Optional; -import java.util.Set; +import java.util.*; +import java.util.function.Consumer; @EventBusSubscriber(modid = Mod.MODID, bus = EventBusSubscriber.Bus.MOD) public abstract class GunItem extends Item implements CustomRendererItem { public GunItem(Properties properties) { super(properties); + addReloadTimeBehavior(this.reloadTimeBehaviors); } @Override @@ -497,6 +497,18 @@ public abstract class GunItem extends Item implements CustomRendererItem { } } + public final Map> reloadTimeBehaviors = new HashMap<>(); + + /** + * 添加达到指定换弹时间时的额外行为 + */ + public void addReloadTimeBehavior(Map> behaviors) { + } + + public Item getCustomAmmoItem() { + return null; + } + @SubscribeEvent private static void registerGunExtensions(RegisterClientExtensionsEvent event) { for (var item : ModItems.GUNS.getEntries()) { diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/data/Charge.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/data/Charge.java index 67cbe1318..6d9bfab02 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/data/Charge.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/data/Charge.java @@ -1,43 +1,15 @@ package com.atsuishio.superbwarfare.item.gun.data; -import net.minecraft.nbt.CompoundTag; - public final class Charge { - private final CompoundTag data; + public final Timer timer; + public final Starter starter; Charge(GunData data) { - this.data = data.data(); - } - - public void markStart() { - data.putBoolean("StartCharge", true); - } - - public boolean shouldStartCharge() { - return data.getBoolean("StartCharge"); - } - - public void markStarted() { - data.remove("StartCharge"); + this.timer = new Timer(data.data(), "Charge"); + this.starter = new Starter(data.data(), "Charge"); } public int time() { - return data.getInt("ChargeTime"); - } - - public void reduce() { - setTime(time() - 1); - } - - public void setTime(int chargeTime) { - if (chargeTime <= 0) { - data.remove("ChargeTime"); - } else { - data.putInt("ChargeTime", chargeTime); - } - } - - public void reset() { - setTime(0); + return timer.get(); } } diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/data/GunData.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/data/GunData.java index 5b99da2b0..6f12e31dd 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/data/GunData.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/data/GunData.java @@ -155,31 +155,31 @@ public class GunData { return getGunData("Headshot", 1.5) + item.getCustomHeadshot(stack); } - public int normalReloadTime() { + public int defaultNormalReloadTime() { return (int) getGunData("NormalReloadTime"); } - public int emptyReloadTime() { + public int defaultEmptyReloadTime() { return (int) getGunData("EmptyReloadTime"); } - public int iterativeTime() { + public int defaultIterativeTime() { return (int) getGunData("IterativeTime"); } - public int prepareTime() { + public int defaultPrepareTime() { return (int) getGunData("PrepareTime"); } - public int prepareLoadTime() { + public int defaultPrepareLoadTime() { return (int) getGunData("PrepareLoadTime"); } - public int prepareEmptyTime() { + public int defaultPrepareEmptyTime() { return (int) getGunData("PrepareEmptyTime"); } - public int finishTime() { + public int defaultFinishTime() { return (int) getGunData("FinishTime"); } @@ -300,6 +300,102 @@ public class GunData { return charge.time() > 0; } + public boolean canImmediatelyShoot() { + return data.getBoolean("CanImmediatelyShoot"); + } + + public void setCanImmediatelyShoot(boolean value) { + if (!value) { + data.remove("CanImmediatelyShoot"); + } else { + data.putBoolean("CanImmediatelyShoot", true); + } + } + + public boolean DA() { + return data.getBoolean("DA"); + } + + public void setDA(boolean value) { + if (!value) { + data.remove("DA"); + } else { + data.putBoolean("DA", true); + } + } + + public boolean isEmpty() { + return data.getBoolean("IsEmpty"); + } + + public void setIsEmpty(boolean value) { + if (!value) { + data.remove("IsEmpty"); + } else { + data.putBoolean("IsEmpty", true); + } + } + + public boolean closeHammer() { + return data.getBoolean("CloseHammer"); + } + + public void setCloseHammer(boolean value) { + if (!value) { + data.remove("CloseHammer"); + } else { + data.putBoolean("CloseHammer", true); + } + } + + public boolean stopped() { + return data.getBoolean("Stopped"); + } + + public void setStopped(boolean value) { + if (!value) { + data.remove("Stopped"); + } else { + data.putBoolean("Stopped", true); + } + } + + public boolean forceStop() { + return data.getBoolean("ForceStop"); + } + + public void setForceStop(boolean value) { + if (!value) { + data.remove("ForceStop"); + } else { + data.putBoolean("ForceStop", true); + } + } + + public int loadIndex() { + return data.getInt("LoadIndex"); + } + + public void setLoadIndex(int value) { + if (value == 0) { + data.remove("LoadIndex"); + return; + } + data.putInt("LoadIndex", value); + } + + public int maxAmmo() { + return data.getInt("MaxAmmo"); + } + + public void setMaxAmmo(int value) { + if (value == 0) { + data.remove("MaxAmmo"); + return; + } + data.putInt("MaxAmmo", value); + } + public final Bolt bolt; public final Attachment attachment; public final Perks perk; diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/data/Reload.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/data/Reload.java index e1eff37b9..b5af55d41 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/data/Reload.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/data/Reload.java @@ -5,8 +5,28 @@ import net.minecraft.nbt.CompoundTag; public final class Reload { private final CompoundTag data; + public final Timer reloadTimer; + public final Timer prepareTimer; + public final Timer prepareLoadTimer; + public final Timer iterativeLoadTimer; + public final Timer finishTimer; + + public final Starter reloadStarter; + public final Starter singleReloadStarter; + public final Starter stage3Starter; + Reload(GunData data) { this.data = data.data(); + + reloadTimer = new Timer(this.data, "Reload"); + prepareTimer = new Timer(this.data, "Prepare"); + prepareLoadTimer = new Timer(this.data, "PrepareLoad"); + iterativeLoadTimer = new Timer(this.data, "IterativeLoad"); + finishTimer = new Timer(this.data, "Finish"); + + reloadStarter = new Starter(this.data, "Reload"); + singleReloadStarter = new Starter(this.data, "SingleReload"); + stage3Starter = new Starter(this.data, "Stage3Forcefully"); } public ReloadState state() { @@ -45,31 +65,16 @@ public final class Reload { } } - public void markStart() { - data.putBoolean("StartReload", true); - } - - public void markStarted() { - data.remove("StartReload"); - } - - public boolean shouldStart() { - return data.getBoolean("StartReload"); - } public int time() { - return data.getInt("ReloadTime"); + return reloadTimer.get(); } public void setTime(int time) { - if (time <= 0) { - data.remove("ReloadTime"); - } else { - data.putInt("ReloadTime", time); - } + reloadTimer.set(time); } public void reduce() { - setTime(time() - 1); + reloadTimer.reduce(); } } diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/data/Starter.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/data/Starter.java new file mode 100644 index 000000000..3163bf871 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/data/Starter.java @@ -0,0 +1,45 @@ +package com.atsuishio.superbwarfare.item.gun.data; + +import net.minecraft.nbt.CompoundTag; + +public class Starter { + private final CompoundTag tag; + private final String name; + + Starter(CompoundTag tag, String name) { + this.tag = tag; + this.name = "Start" + name; + } + + /** + * 检测当前状态是否应该开始 + */ + public boolean shouldStart() { + return tag.getBoolean(name); + } + + /** + * 将当前状态设置为开始 + */ + public void markStart() { + tag.putBoolean(name, true); + } + + /** + * 将当前状态设置为结束 + */ + public void finish() { + tag.remove(name); + } + + /** + * 检测阶段是否应该开始,返回当前状态,并设置为结束 + */ + public boolean start() { + if (shouldStart()) { + finish(); + return true; + } + return false; + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/data/Timer.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/data/Timer.java new file mode 100644 index 000000000..7537c0274 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/data/Timer.java @@ -0,0 +1,37 @@ +package com.atsuishio.superbwarfare.item.gun.data; + +import net.minecraft.nbt.CompoundTag; + +public class Timer { + private final CompoundTag tag; + public final String name; + + Timer(CompoundTag tag, String name) { + this.tag = tag; + this.name = name + "Time"; + } + + public int get() { + return tag.getInt(name); + } + + public void set(int time) { + if (time <= 0) { + tag.remove(name); + } else { + tag.putInt(name, time); + } + } + + public void add(int time) { + set(get() + time); + } + + public void reduce() { + add(-1); + } + + public void reset() { + set(0); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/Glock17Item.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/Glock17Item.java index 4a3e24743..05f49c9ad 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/Glock17Item.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/Glock17Item.java @@ -23,7 +23,9 @@ import software.bernie.geckolib.animation.*; import software.bernie.geckolib.renderer.GeoItemRenderer; import software.bernie.geckolib.util.GeckoLibUtil; +import java.util.Map; import java.util.Set; +import java.util.function.Consumer; public class Glock17Item extends GunItem implements GeoItem { @@ -138,4 +140,11 @@ public class Glock17Item extends GunItem implements GeoItem { public int getAvailableFireModes() { return FireMode.SEMI.flag; } + + @Override + public void addReloadTimeBehavior(Map> behaviors) { + super.addReloadTimeBehavior(behaviors); + + behaviors.put(9, data -> data.data().remove("HoldOpen")); + } } \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/Glock18Item.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/Glock18Item.java index 8385635b1..fae926c4a 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/Glock18Item.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/Glock18Item.java @@ -24,7 +24,9 @@ import software.bernie.geckolib.animation.*; import software.bernie.geckolib.renderer.GeoItemRenderer; import software.bernie.geckolib.util.GeckoLibUtil; +import java.util.Map; import java.util.Set; +import java.util.function.Consumer; public class Glock18Item extends GunItem implements GeoItem { @@ -146,4 +148,11 @@ public class Glock18Item extends GunItem implements GeoItem { public int getAvailableFireModes() { return FireMode.SEMI.flag + FireMode.AUTO.flag; } + + @Override + public void addReloadTimeBehavior(Map> behaviors) { + super.addReloadTimeBehavior(behaviors); + + behaviors.put(9, data -> data.data().remove("HoldOpen")); + } } \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/M1911Item.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/M1911Item.java index e6110e216..ebdde8198 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/M1911Item.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/M1911Item.java @@ -23,7 +23,9 @@ import software.bernie.geckolib.animation.*; import software.bernie.geckolib.renderer.GeoItemRenderer; import software.bernie.geckolib.util.GeckoLibUtil; +import java.util.Map; import java.util.Set; +import java.util.function.Consumer; public class M1911Item extends GunItem implements GeoItem { @@ -141,4 +143,11 @@ public class M1911Item extends GunItem implements GeoItem { public int getAvailableFireModes() { return FireMode.SEMI.flag; } + + @Override + public void addReloadTimeBehavior(Map> behaviors) { + super.addReloadTimeBehavior(behaviors); + + behaviors.put(9, data -> data.data().remove("HoldOpen")); + } } \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/Mp443Item.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/Mp443Item.java index 8ad9a348c..872fbe81d 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/Mp443Item.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/Mp443Item.java @@ -23,7 +23,9 @@ import software.bernie.geckolib.animation.*; import software.bernie.geckolib.renderer.GeoItemRenderer; import software.bernie.geckolib.util.GeckoLibUtil; +import java.util.Map; import java.util.Set; +import java.util.function.Consumer; public class Mp443Item extends GunItem implements GeoItem { @@ -138,4 +140,11 @@ public class Mp443Item extends GunItem implements GeoItem { public int getAvailableFireModes() { return FireMode.SEMI.flag; } + + @Override + public void addReloadTimeBehavior(Map> behaviors) { + super.addReloadTimeBehavior(behaviors); + + behaviors.put(9, data -> data.data().remove("HoldOpen")); + } } \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/Trachelium.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/Trachelium.java index 97673861f..743dfd3e8 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/Trachelium.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/Trachelium.java @@ -249,7 +249,7 @@ public class Trachelium extends GunItem implements GeoItem { @Override public int getCustomBoltActionTime(ItemStack stack) { - return GunData.from(stack).tag().getBoolean("DA") ? 12 : 0; + return GunData.from(stack).DA() ? 12 : 0; } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/JavelinItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/JavelinItem.java index 30c1aeded..06343d27e 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/JavelinItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/JavelinItem.java @@ -32,6 +32,7 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.animal.Pig; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.tooltip.TooltipComponent; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.ClipContext; @@ -136,7 +137,7 @@ public class JavelinItem extends GunItem implements GeoItem, SpecialFireWeapon { final var tag = data.tag(); if (entity instanceof Player player && selected) { - GunsTool.setGunIntTag(tag, "MaxAmmo", getAmmoCount(player)); + data.setMaxAmmo(getAmmoCount(player)); if (tag.getBoolean("Seeking")) { @@ -329,4 +330,9 @@ public class JavelinItem extends GunItem implements GeoItem, SpecialFireWeapon { tag.putBoolean("Seeking", true); tag.putInt("SeekTime", 0); } + + @Override + public Item getCustomAmmoItem() { + return ModItems.JAVELIN_MISSILE.get(); + } } \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/M79Item.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/M79Item.java index 9b498317c..bba1eb099 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/M79Item.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/M79Item.java @@ -12,7 +12,6 @@ import com.atsuishio.superbwarfare.item.gun.data.GunData; import com.atsuishio.superbwarfare.network.message.receive.ShootClientMessage; import com.atsuishio.superbwarfare.perk.Perk; import com.atsuishio.superbwarfare.perk.PerkHelper; -import com.atsuishio.superbwarfare.tools.GunsTool; import com.atsuishio.superbwarfare.tools.ParticleTool; import com.atsuishio.superbwarfare.tools.SoundTool; import net.minecraft.client.Minecraft; @@ -27,6 +26,7 @@ import net.minecraft.world.effect.MobEffects; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.tooltip.TooltipComponent; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Rarity; @@ -125,8 +125,7 @@ public class M79Item extends GunItem implements GeoItem, SpecialFireWeapon { super.inventoryTick(stack, world, entity, slot, selected); if (entity instanceof Player player) { var data = GunData.from(stack); - final var tag = data.tag(); - GunsTool.setGunIntTag(tag, "MaxAmmo", getAmmoCount(player)); + data.setMaxAmmo(getAmmoCount(player)); data.save(); } } @@ -220,4 +219,9 @@ public class M79Item extends GunItem implements GeoItem, SpecialFireWeapon { player.getCooldowns().addCooldown(stack.getItem(), 2); data.setAmmo(data.ammo() - 1); } + + @Override + public Item getCustomAmmoItem() { + return ModItems.GRENADE_40MM.get(); + } } \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/RpgItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/RpgItem.java index e618dd790..3e19dc19e 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/RpgItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/RpgItem.java @@ -12,7 +12,6 @@ import com.atsuishio.superbwarfare.item.gun.data.GunData; import com.atsuishio.superbwarfare.network.message.receive.ShootClientMessage; import com.atsuishio.superbwarfare.perk.Perk; import com.atsuishio.superbwarfare.perk.PerkHelper; -import com.atsuishio.superbwarfare.tools.GunsTool; import com.atsuishio.superbwarfare.tools.ParticleTool; import com.atsuishio.superbwarfare.tools.SoundTool; import net.minecraft.client.Minecraft; @@ -27,6 +26,7 @@ import net.minecraft.world.effect.MobEffects; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.tooltip.TooltipComponent; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Rarity; @@ -40,8 +40,10 @@ import software.bernie.geckolib.renderer.GeoItemRenderer; import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.ParametersAreNonnullByDefault; +import java.util.Map; import java.util.Optional; import java.util.Set; +import java.util.function.Consumer; public class RpgItem extends GunItem implements GeoItem, SpecialFireWeapon { @@ -134,12 +136,12 @@ public class RpgItem extends GunItem implements GeoItem, SpecialFireWeapon { tag.putBoolean("draw", false); if (data.ammo() == 0) { - tag.putBoolean("IsEmpty", true); + data.setIsEmpty(true); } } if (entity instanceof Player player) { - GunsTool.setGunIntTag(tag, "MaxAmmo", getAmmoCount(player)); + data.setMaxAmmo(getAmmoCount(player)); } data.save(); @@ -179,7 +181,6 @@ public class RpgItem extends GunItem implements GeoItem, SpecialFireWeapon { public void fireOnPress(Player player, final GunData data) { Level level = player.level(); ItemStack stack = player.getMainHandItem(); - var tag = data.tag(); if (data.reloading() || player.getCooldowns().isOnCooldown(stack.getItem()) @@ -236,11 +237,24 @@ public class RpgItem extends GunItem implements GeoItem, SpecialFireWeapon { } if (data.ammo() == 1) { - tag.putBoolean("IsEmpty", true); - GunsTool.setGunBooleanTag(tag, "CloseHammer", true); + data.setIsEmpty(true); + data.setCloseHammer(true); } player.getCooldowns().addCooldown(stack.getItem(), 10); data.setAmmo(data.ammo() - 1); } + + @Override + public void addReloadTimeBehavior(Map> behaviors) { + super.addReloadTimeBehavior(behaviors); + + behaviors.put(84, data -> data.setIsEmpty(false)); + behaviors.put(9, data -> data.setCloseHammer(false)); + } + + @Override + public Item getCustomAmmoItem() { + return ModItems.ROCKET.get(); + } } \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/SecondaryCataclysm.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/SecondaryCataclysm.java index ad6830f87..5724f87b6 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/SecondaryCataclysm.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/SecondaryCataclysm.java @@ -13,7 +13,6 @@ import com.atsuishio.superbwarfare.item.gun.data.GunData; import com.atsuishio.superbwarfare.network.message.receive.ShootClientMessage; import com.atsuishio.superbwarfare.perk.Perk; import com.atsuishio.superbwarfare.perk.PerkHelper; -import com.atsuishio.superbwarfare.tools.GunsTool; import com.atsuishio.superbwarfare.tools.ParticleTool; import com.atsuishio.superbwarfare.tools.SoundTool; import net.minecraft.client.Minecraft; @@ -30,6 +29,7 @@ import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.tooltip.TooltipComponent; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.component.ItemAttributeModifiers; @@ -87,17 +87,16 @@ public class SecondaryCataclysm extends GunItem implements GeoItem, SpecialFireW ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; var data = GunData.from(stack); - final var tag = data.tag(); - if (data.reload.stage() == 1 && tag.getDouble("PrepareLoadTime") > 0) { + if (data.reload.stage() == 1 && data.reload.prepareLoadTimer.get() > 0) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.sc.prepare")); } - if (tag.getDouble("LoadIndex") == 0 && data.reload.stage() == 2) { + if (data.loadIndex() == 0 && data.reload.stage() == 2) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.sc.iterativeload")); } - if (tag.getDouble("LoadIndex") == 1 && data.reload.stage() == 2) { + if (data.loadIndex() == 1 && data.reload.stage() == 2) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.sc.iterativeload2")); } @@ -180,8 +179,7 @@ public class SecondaryCataclysm extends GunItem implements GeoItem, SpecialFireW if (entity instanceof Player player) { var data = GunData.from(stack); - final var tag = data.tag(); - GunsTool.setGunIntTag(tag, "MaxAmmo", getAmmoCount(player)); + data.setMaxAmmo(getAmmoCount(player)); data.save(); } @@ -346,4 +344,9 @@ public class SecondaryCataclysm extends GunItem implements GeoItem, SpecialFireW public int getMaxEnergy() { return 24000; } + + @Override + public Item getCustomAmmoItem() { + return ModItems.GRENADE_40MM.get(); + } } \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/machinegun/M60Item.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/machinegun/M60Item.java index 2ce2c3e76..dc472c6c8 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/machinegun/M60Item.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/machinegun/M60Item.java @@ -28,7 +28,9 @@ import software.bernie.geckolib.renderer.GeoItemRenderer; import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.ParametersAreNonnullByDefault; +import java.util.Map; import java.util.Set; +import java.util.function.Consumer; public class M60Item extends GunItem implements GeoItem { @@ -159,4 +161,11 @@ public class M60Item extends GunItem implements GeoItem { public int getAvailableFireModes() { return FireMode.AUTO.flag; } + + @Override + public void addReloadTimeBehavior(Map> behaviors) { + super.addReloadTimeBehavior(behaviors); + + behaviors.put(55, data -> data.data().remove("HideBulletChain")); + } } \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/MarlinItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/MarlinItem.java index ee1070198..fc08f2190 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/MarlinItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/MarlinItem.java @@ -49,21 +49,20 @@ public class MarlinItem extends GunItem implements GeoItem { ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; var data = GunData.from(stack); - final var tag = data.tag(); if (data.bolt.actionTime() > 0) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.marlin.shift")); } - if (data.reload.stage() == 1 && tag.getDouble("PrepareTime") > 0) { + if (data.reload.stage() == 1 && data.reload.prepareTimer.get() > 0) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.marlin.prepare")); } - if (tag.getDouble("LoadIndex") == 0 && data.reload.stage() == 2) { + if (data.loadIndex() == 0 && data.reload.stage() == 2) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.marlin.iterativeload")); } - if (tag.getDouble("LoadIndex") == 1 && data.reload.stage() == 2) { + if (data.loadIndex() == 1 && data.reload.stage() == 2) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.marlin.iterativeload2")); } diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/Mk14Item.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/Mk14Item.java index 3dc422961..8a809b864 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/Mk14Item.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/Mk14Item.java @@ -27,7 +27,9 @@ import software.bernie.geckolib.animation.*; import software.bernie.geckolib.renderer.GeoItemRenderer; import software.bernie.geckolib.util.GeckoLibUtil; +import java.util.Map; import java.util.Set; +import java.util.function.Consumer; public class Mk14Item extends GunItem implements GeoItem { @@ -238,4 +240,11 @@ public class Mk14Item extends GunItem implements GeoItem { public int getAvailableFireModes() { return FireMode.SEMI.flag + FireMode.AUTO.flag; } + + @Override + public void addReloadTimeBehavior(Map> behaviors) { + super.addReloadTimeBehavior(behaviors); + + behaviors.put(18, data -> data.data().remove("HoldOpen")); + } } \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/Qbz95Item.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/Qbz95Item.java index 40abe219a..2f77ad596 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/Qbz95Item.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/Qbz95Item.java @@ -30,7 +30,9 @@ import software.bernie.geckolib.renderer.GeoItemRenderer; import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.ParametersAreNonnullByDefault; +import java.util.Map; import java.util.Set; +import java.util.function.Consumer; public class Qbz95Item extends GunItem implements GeoItem { @@ -246,4 +248,11 @@ public class Qbz95Item extends GunItem implements GeoItem { public int getAvailableFireModes() { return FireMode.SEMI.flag + FireMode.AUTO.flag; } + + @Override + public void addReloadTimeBehavior(Map> behaviors) { + super.addReloadTimeBehavior(behaviors); + + behaviors.put(14, data -> data.data().remove("HoldOpen")); + } } \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/SksItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/SksItem.java index 26dd3c0f3..60c1dcc9e 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/SksItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/SksItem.java @@ -27,7 +27,9 @@ import software.bernie.geckolib.renderer.GeoItemRenderer; import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.ParametersAreNonnullByDefault; +import java.util.Map; import java.util.Set; +import java.util.function.Consumer; public class SksItem extends GunItem implements GeoItem { @@ -143,4 +145,11 @@ public class SksItem extends GunItem implements GeoItem { public int getAvailableFireModes() { return FireMode.SEMI.flag; } + + @Override + public void addReloadTimeBehavior(Map> behaviors) { + super.addReloadTimeBehavior(behaviors); + + behaviors.put(14, data -> data.data().remove("HoldOpen")); + } } \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/shotgun/M870Item.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/shotgun/M870Item.java index 47192f84c..31706737a 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/shotgun/M870Item.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/shotgun/M870Item.java @@ -10,7 +10,6 @@ import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.item.gun.data.GunData; import com.atsuishio.superbwarfare.perk.Perk; import com.atsuishio.superbwarfare.perk.PerkHelper; -import com.atsuishio.superbwarfare.tools.NBTTool; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; import net.minecraft.resources.ResourceLocation; @@ -54,25 +53,24 @@ public class M870Item extends GunItem implements GeoItem { ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; var data = GunData.from(stack); - final var tag = NBTTool.getTag(stack); if (data.bolt.actionTime() > 0) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m870.shift")); } - if (data.reload.stage() == 1 && tag.getDouble("PrepareLoadTime") > 0) { + if (data.reload.stage() == 1 && data.reload.iterativeLoadTimer.get() > 0) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m870.preparealt")); } - if (data.reload.stage() == 1 && tag.getDouble("PrepareTime") > 0) { + if (data.reload.stage() == 1 && data.reload.prepareTimer.get() > 0) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m870.prepare")); } - if (tag.getDouble("LoadIndex") == 0 && data.reload.stage() == 2) { + if (data.loadIndex() == 0 && data.reload.stage() == 2) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m870.iterativeload")); } - if (tag.getDouble("LoadIndex") == 1 && data.reload.stage() == 2) { + if (data.loadIndex() == 1 && data.reload.stage() == 2) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m870.iterativeload2")); } diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/K98Item.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/K98Item.java index 1a24ac1b7..9a644c3cb 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/K98Item.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/K98Item.java @@ -50,7 +50,6 @@ public class K98Item extends GunItem implements GeoItem { ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; var data = GunData.from(stack); - final var tag = data.tag(); if (data.bolt.actionTime() > 0) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.k98.shift")); @@ -60,15 +59,15 @@ public class K98Item extends GunItem implements GeoItem { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.k98.reload_empty")); } - if (data.reload.stage() == 1 && tag.getDouble("PrepareTime") > 0) { + if (data.reload.stage() == 1 && data.reload.prepareTimer.get() > 0) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.k98.prepare")); } - if (tag.getDouble("LoadIndex") == 0 && data.reload.stage() == 2) { + if (data.loadIndex() == 0 && data.reload.stage() == 2) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.k98.iterativeload")); } - if (tag.getDouble("LoadIndex") == 1 && data.reload.stage() == 2) { + if (data.loadIndex() == 1 && data.reload.stage() == 2) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.k98.iterativeload2")); } @@ -86,7 +85,6 @@ public class K98Item extends GunItem implements GeoItem { ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; var data = GunData.from(stack); - final var tag = data.tag(); if (player.isSprinting() && player.onGround() && player.getPersistentData().getDouble("noRun") == 0 diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/MosinNagantItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/MosinNagantItem.java index 5347bbb0f..b2180f20e 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/MosinNagantItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/MosinNagantItem.java @@ -9,7 +9,6 @@ import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.item.gun.data.GunData; import com.atsuishio.superbwarfare.perk.Perk; import com.atsuishio.superbwarfare.perk.PerkHelper; -import com.atsuishio.superbwarfare.tools.NBTTool; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; import net.minecraft.resources.ResourceLocation; @@ -50,7 +49,6 @@ public class MosinNagantItem extends GunItem implements GeoItem { ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; var data = GunData.from(stack); - final var tag = data.tag(); if (data.bolt.actionTime() > 0) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.mosin.shift")); @@ -64,11 +62,11 @@ public class MosinNagantItem extends GunItem implements GeoItem { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.mosin.prepare")); } - if (NBTTool.getTag(stack).getDouble("LoadIndex") == 0 && data.reload.stage() == 2) { + if (data.loadIndex() == 0 && data.reload.stage() == 2) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.mosin.iterativeload")); } - if (NBTTool.getTag(stack).getDouble("LoadIndex") == 1 && data.reload.stage() == 2) { + if (data.loadIndex() == 1 && data.reload.stage() == 2) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.mosin.iterativeload2")); } @@ -85,7 +83,6 @@ public class MosinNagantItem extends GunItem implements GeoItem { ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; var data = GunData.from(stack); - final var tag = data.tag(); if (player.isSprinting() && player.onGround() && player.getPersistentData().getDouble("noRun") == 0 diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/SvdItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/SvdItem.java index 410d9da58..4e098083c 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/SvdItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/SvdItem.java @@ -27,7 +27,9 @@ import software.bernie.geckolib.animation.*; import software.bernie.geckolib.renderer.GeoItemRenderer; import software.bernie.geckolib.util.GeckoLibUtil; +import java.util.Map; import java.util.Set; +import java.util.function.Consumer; public class SvdItem extends GunItem implements GeoItem { @@ -192,4 +194,11 @@ public class SvdItem extends GunItem implements GeoItem { public int getAvailableFireModes() { return FireMode.SEMI.flag; } + + @Override + public void addReloadTimeBehavior(Map> behaviors) { + super.addReloadTimeBehavior(behaviors); + + behaviors.put(17, data -> data.data().remove("HoldOpen")); + } } \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/special/BocekItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/special/BocekItem.java index 51d0290c7..1656f0ed7 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/special/BocekItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/special/BocekItem.java @@ -115,7 +115,7 @@ public class BocekItem extends GunItem implements GeoItem, SpecialFireWeapon { var data = GunData.from(stack); final var tag = data.tag(); if (entity instanceof Player player) { - GunsTool.setGunIntTag(tag, "MaxAmmo", getAmmoCount(player)); + data.setMaxAmmo(getAmmoCount(player)); data.save(); } diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/special/TaserItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/special/TaserItem.java index 86bfe0610..b1732c942 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/special/TaserItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/special/TaserItem.java @@ -12,7 +12,6 @@ import com.atsuishio.superbwarfare.item.gun.SpecialFireWeapon; import com.atsuishio.superbwarfare.item.gun.data.GunData; import com.atsuishio.superbwarfare.network.message.receive.ShootClientMessage; import com.atsuishio.superbwarfare.perk.Perk; -import com.atsuishio.superbwarfare.tools.GunsTool; import com.atsuishio.superbwarfare.tools.SoundTool; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; @@ -24,6 +23,7 @@ import net.minecraft.world.effect.MobEffects; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.tooltip.TooltipComponent; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Rarity; @@ -142,10 +142,9 @@ public class TaserItem extends GunItem implements GeoItem, SpecialFireWeapon, En public void inventoryTick(ItemStack stack, Level world, Entity entity, int slot, boolean selected) { super.inventoryTick(stack, world, entity, slot, selected); var data = GunData.from(stack); - final var tag = data.tag(); if (entity instanceof Player player) { - GunsTool.setGunIntTag(tag, "MaxAmmo", getAmmoCount(player)); + data.setMaxAmmo(getAmmoCount(player)); data.save(); } @@ -265,4 +264,9 @@ public class TaserItem extends GunItem implements GeoItem, SpecialFireWeapon, En public int getMaxEnergy() { return MAX_ENERGY; } + + @Override + public Item getCustomAmmoItem() { + return ModItems.TASER_ELECTRODE.get(); + } } diff --git a/src/main/java/com/atsuishio/superbwarfare/network/message/send/FireMessage.java b/src/main/java/com/atsuishio/superbwarfare/network/message/send/FireMessage.java index bc0d29cf5..05f4f061a 100644 --- a/src/main/java/com/atsuishio/superbwarfare/network/message/send/FireMessage.java +++ b/src/main/java/com/atsuishio/superbwarfare/network/message/send/FireMessage.java @@ -45,15 +45,14 @@ public record FireMessage(int msgType) implements CustomPacketPayload { ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return; var data = GunData.from(stack); - final var tag = data.tag(); handleGunBolt(player, stack); var cap = player.getData(ModAttachments.PLAYER_VARIABLE).watch(); if (type == 0) { - if (tag.getDouble("PrepareTime") == 0 && data.reloading() && data.ammo() > 0) { - tag.putBoolean("ForceStop", true); + if (data.reload.prepareTimer.get() == 0 && data.reloading() && data.ammo() > 0) { + data.setForceStop(true); } cap.edit = false; diff --git a/src/main/java/com/atsuishio/superbwarfare/network/message/send/FireModeMessage.java b/src/main/java/com/atsuishio/superbwarfare/network/message/send/FireModeMessage.java index 579c40c8e..b2425a64b 100644 --- a/src/main/java/com/atsuishio/superbwarfare/network/message/send/FireModeMessage.java +++ b/src/main/java/com/atsuishio/superbwarfare/network/message/send/FireModeMessage.java @@ -95,7 +95,7 @@ public record FireModeMessage(int msgType) implements CustomPacketPayload { if (cell.is(ModItems.CELL.get())) { var cap = cell.getCapability(Capabilities.EnergyStorage.ITEM); if (cap != null && cap.getEnergyStored() > 0) { - data.charge.markStart(); + data.charge.starter.markStart(); } } } @@ -110,8 +110,8 @@ public record FireModeMessage(int msgType) implements CustomPacketPayload { } if (stack.getItem() == ModItems.TRACHELIUM.get() && !data.bolt.needed()) { - tag.putBoolean("DA", !tag.getBoolean("DA")); - if (!tag.getBoolean("canImmediatelyShoot")) { + data.setDA(!data.DA()); + if (!data.canImmediatelyShoot()) { data.bolt.markNeeded(); } } diff --git a/src/main/java/com/atsuishio/superbwarfare/network/message/send/ReloadMessage.java b/src/main/java/com/atsuishio/superbwarfare/network/message/send/ReloadMessage.java index 0a68941d7..ebf3c4f0c 100644 --- a/src/main/java/com/atsuishio/superbwarfare/network/message/send/ReloadMessage.java +++ b/src/main/java/com/atsuishio/superbwarfare/network/message/send/ReloadMessage.java @@ -6,7 +6,6 @@ import com.atsuishio.superbwarfare.init.ModItems; import com.atsuishio.superbwarfare.init.ModTags; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.item.gun.data.GunData; -import com.atsuishio.superbwarfare.tools.GunsTool; import io.netty.buffer.ByteBuf; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; @@ -40,7 +39,6 @@ public record ReloadMessage(int msgType) implements CustomPacketPayload { if (!(stack.getItem() instanceof GunItem gunItem)) return; var data = GunData.from(stack); - var tag = data.tag(); if (!player.isSpectator() && !data.charging() @@ -60,15 +58,15 @@ public record ReloadMessage(int msgType) implements CustomPacketPayload { return; } else if (stack.is(ModTags.Items.USE_SNIPER_AMMO) && cap.sniperAmmo == 0) { return; - } else if ((stack.is(ModTags.Items.USE_HANDGUN_AMMO) || stack.is(ModTags.Items.SMG)) && cap.handgunAmmo == 0) { + } else if (stack.is(ModTags.Items.USE_HANDGUN_AMMO) && cap.handgunAmmo == 0) { return; } else if (stack.is(ModTags.Items.USE_RIFLE_AMMO) && cap.rifleAmmo == 0) { return; } else if (stack.is(ModTags.Items.USE_HEAVY_AMMO) && cap.heavyAmmo == 0) { return; - } else if (stack.getItem() == ModItems.TASER.get() && GunsTool.getGunIntTag(tag, "MaxAmmo") == 0) { + } else if (stack.getItem() == ModItems.TASER.get() && data.maxAmmo() == 0) { return; - } else if (stack.is(ModTags.Items.LAUNCHER) && GunsTool.getGunIntTag(tag, "MaxAmmo") == 0) { + } else if (stack.is(ModTags.Items.LAUNCHER) && data.maxAmmo() == 0) { return; } } @@ -79,13 +77,13 @@ public record ReloadMessage(int msgType) implements CustomPacketPayload { var maxAmmo = magazine + extra; if (data.ammo() < maxAmmo) { - data.reload.markStart(); + data.reload.reloadStarter.markStart(); } return; } if (canSingleReload && data.ammo() < data.magazine()) { - tag.putBoolean("StartSingleReload", true); + data.reload.singleReloadStarter.markStart(); } data.save(); } diff --git a/src/main/java/com/atsuishio/superbwarfare/network/message/send/ShootMessage.java b/src/main/java/com/atsuishio/superbwarfare/network/message/send/ShootMessage.java index a34dae908..c34216037 100644 --- a/src/main/java/com/atsuishio/superbwarfare/network/message/send/ShootMessage.java +++ b/src/main/java/com/atsuishio/superbwarfare/network/message/send/ShootMessage.java @@ -52,7 +52,7 @@ public record ShootMessage(double spread) implements CustomPacketPayload { } if (stack.is(ModTags.Items.REVOLVER)) { - tag.putBoolean("canImmediatelyShoot", false); + data.setCanImmediatelyShoot(false); } // 判断是否为栓动武器(BoltActionTime > 0),并在开火后给一个需要上膛的状态 @@ -61,7 +61,7 @@ public record ShootMessage(double spread) implements CustomPacketPayload { } data.setAmmo(data.ammo() - 1); - tag.putBoolean("IsEmpty", true); + data.setIsEmpty(true); if (stack.getItem() == ModItems.M_60.get() && data.ammo() <= 5) { GunsTool.setGunBooleanTag(tag, "HideBulletChain", true); @@ -86,7 +86,7 @@ public record ShootMessage(double spread) implements CustomPacketPayload { var perk = data.perk.get(Perk.Type.AMMO); for (int index0 = 0; index0 < (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug ? 1 : projectileAmount); index0++) { - GunEventHandler.gunShoot(player, tag, spared); + GunEventHandler.gunShoot(player, data, spared); } GunEventHandler.playGunSounds(player); @@ -119,7 +119,7 @@ public record ShootMessage(double spread) implements CustomPacketPayload { } } - GunEventHandler.gunShoot(player, tag, spared); + GunEventHandler.gunShoot(player, data, spared); if (!InventoryTool.hasCreativeAmmoBox(player)) { cap.rifleAmmo = cap.rifleAmmo - 1; player.setData(ModAttachments.PLAYER_VARIABLE, cap);