diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/SpecialFireWeapon.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/SpecialFireWeapon.java index e4729c144..fd6595cf5 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/SpecialFireWeapon.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/SpecialFireWeapon.java @@ -1,6 +1,5 @@ package com.atsuishio.superbwarfare.item.gun; -import net.minecraft.nbt.CompoundTag; import net.minecraft.world.entity.player.Player; @@ -16,7 +15,7 @@ public interface SpecialFireWeapon { * @param player 玩家 */ - default void fireOnPress(Player player, final CompoundTag tag) { + default void fireOnPress(Player player, final GunData data) { } /** @@ -24,7 +23,7 @@ public interface SpecialFireWeapon { * * @param player 玩家 */ - default void fireOnRelease(Player player, final CompoundTag tag) { + default void fireOnRelease(Player player, final GunData data) { } } 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 d463851b3..9a263bbeb 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 @@ -293,8 +293,9 @@ public class JavelinItem extends GunItem implements GeoItem, SpecialFireWeapon { } @Override - public void fireOnRelease(Player player, final CompoundTag tag) { + public void fireOnRelease(Player player, final GunData data) { fire(player); + var tag = data.getTag(); tag.putBoolean("Seeking", false); tag.putInt("SeekTime", 0); tag.putString("TargetEntity", "none"); @@ -305,10 +306,8 @@ public class JavelinItem extends GunItem implements GeoItem, SpecialFireWeapon { } @Override - public void fireOnPress(Player player, CompoundTag tag) { - var stack = player.getMainHandItem(); - var data = GunData.from(stack); - tag = data.getTag(); + public void fireOnPress(Player player, final GunData data) { + var tag = data.getTag(); var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE); if (cap != null && !cap.zoom || data.getAmmo() <= 0) return; 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 23ed0b5bd..a7c1e6e67 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 @@ -23,7 +23,6 @@ import com.atsuishio.superbwarfare.tools.SoundTool; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; @@ -171,12 +170,12 @@ public class M79Item extends GunItem implements GeoItem, SpecialFireWeapon { } @Override - public void fireOnPress(Player player, final CompoundTag tag) { - ItemStack stack = player.getMainHandItem(); - var data = GunData.from(stack); + public void fireOnPress(Player player, final GunData data) { if (data.isReloading()) return; + ItemStack stack = data.getStack(); if (player.getCooldowns().isOnCooldown(stack.getItem()) || data.getAmmo() <= 0) return; + var tag = data.getTag(); var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE); boolean zooming = cap != null && cap.zoom; double spread = data.spread(); @@ -226,6 +225,5 @@ public class M79Item extends GunItem implements GeoItem, SpecialFireWeapon { player.getCooldowns().addCooldown(stack.getItem(), 2); data.setAmmo(data.getAmmo() - 1); - data.save(); } } \ 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 cfb175536..a15dc0d76 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 @@ -23,7 +23,6 @@ import com.atsuishio.superbwarfare.tools.SoundTool; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; @@ -181,11 +180,10 @@ public class RpgItem extends GunItem implements GeoItem, SpecialFireWeapon { } @Override - public void fireOnPress(Player player, CompoundTag tag) { + public void fireOnPress(Player player, final GunData data) { Level level = player.level(); ItemStack stack = player.getMainHandItem(); - var data = GunData.from(stack); - tag = data.getTag(); + var tag = data.getTag(); if (data.isReloading() || player.getCooldowns().isOnCooldown(stack.getItem()) @@ -249,6 +247,5 @@ public class RpgItem extends GunItem implements GeoItem, SpecialFireWeapon { player.getCooldowns().addCooldown(stack.getItem(), 10); data.setAmmo(data.getAmmo() - 1); - data.save(); } } \ 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 96331864b..b0a08f796 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 @@ -21,7 +21,6 @@ import com.atsuishio.superbwarfare.tools.SoundTool; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; @@ -270,12 +269,12 @@ public class SecondaryCataclysm extends GunItem implements GeoItem, SpecialFireW } @Override - public void fireOnPress(Player player, final CompoundTag tag) { - ItemStack stack = player.getMainHandItem(); - var data = GunData.from(stack); + public void fireOnPress(Player player, final GunData data) { if (data.isReloading()) return; + ItemStack stack = data.getStack(); if (player.getCooldowns().isOnCooldown(stack.getItem()) || data.getAmmo() <= 0) return; + var tag = data.getTag(); var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE); boolean zooming = cap != null && cap.zoom; double spread = data.spread(); @@ -343,7 +342,6 @@ public class SecondaryCataclysm extends GunItem implements GeoItem, SpecialFireW } data.setAmmo(data.getAmmo() - 1); - data.save(); player.getCooldowns().addCooldown(stack.getItem(), 6); } 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 267515aff..8c67ebdab 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 @@ -9,6 +9,7 @@ import com.atsuishio.superbwarfare.init.ModItems; import com.atsuishio.superbwarfare.init.ModPerks; import com.atsuishio.superbwarfare.init.ModSounds; import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.GunData; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.item.gun.SpecialFireWeapon; import com.atsuishio.superbwarfare.network.message.receive.ShootClientMessage; @@ -21,7 +22,6 @@ import com.atsuishio.superbwarfare.tools.NBTTool; import com.atsuishio.superbwarfare.tools.SoundTool; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; -import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundSource; @@ -169,10 +169,11 @@ public class BocekItem extends GunItem implements GeoItem, SpecialFireWeapon { } @Override - public void fireOnRelease(Player player, final CompoundTag tag) { + public void fireOnRelease(Player player, final GunData data) { if (player.level().isClientSide()) return; - ItemStack stack = player.getMainHandItem(); + var tag = data.getTag(); + var stack = data.getStack(); var perk = PerkHelper.getPerkByType(tag, Perk.Type.AMMO); if (player instanceof ServerPlayer serverPlayer) { @@ -209,7 +210,6 @@ public class BocekItem extends GunItem implements GeoItem, SpecialFireWeapon { player.getCooldowns().addCooldown(stack.getItem(), 7); GunsTool.setGunIntTag(tag, "ArrowEmpty", 7); GunsTool.setGunDoubleTag(tag, "Power", 0); - NBTTool.saveTag(stack, tag); if (!InventoryTool.hasCreativeAmmoBox(player) && !player.isCreative()) { player.getInventory().clearOrCountMatchingItems(p -> Items.ARROW == p.getItem(), 1, player.inventoryMenu.getCraftSlots()); @@ -218,7 +218,7 @@ public class BocekItem extends GunItem implements GeoItem, SpecialFireWeapon { } @Override - public void fireOnPress(Player player, final CompoundTag tag) { + public void fireOnPress(Player player, final GunData data) { var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE); if (cap != null) { cap.bowPullHold = true; 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 01173ee34..f828cf6e2 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 @@ -22,7 +22,6 @@ import com.atsuishio.superbwarfare.tools.NBTTool; import com.atsuishio.superbwarfare.tools.SoundTool; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; -import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundEvent; @@ -224,10 +223,10 @@ public class TaserItem extends GunItem implements GeoItem, SpecialFireWeapon, En } @Override - public void fireOnPress(Player player, final CompoundTag tag) { - ItemStack stack = player.getMainHandItem(); - var data = GunData.from(stack); + public void fireOnPress(Player player, final GunData data) { if (data.isReloading()) return; + ItemStack stack = data.getStack(); + var tag = data.getTag(); int perkLevel = PerkHelper.getItemPerkLevel(ModPerks.VOLT_OVERLOAD.get(), tag); var energyStorage = stack.getCapability(Capabilities.EnergyStorage.ITEM); @@ -266,7 +265,6 @@ public class TaserItem extends GunItem implements GeoItem, SpecialFireWeapon, En data.setAmmo(data.getAmmo() - 1); data.getTag().putBoolean("shoot", true); - data.save(); energyStorage.extractEnergy(400 + 100 * perkLevel, false); } 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 381bb0ad5..250d2ccdc 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 @@ -46,15 +46,15 @@ public record FireMessage(int msgType) implements CustomPacketPayload { if (player.isSpectator()) return; ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return; - final var tag = NBTTool.getTag(stack); + var data = GunData.from(stack); + final var tag = data.getTag(); - handleGunBolt(player, stack, tag); + handleGunBolt(player, stack); var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE); if (type == 0) { - var data = GunData.from(stack); if (tag.getDouble("prepare") == 0 && data.isReloading() && data.getAmmo() > 0) { - NBTTool.saveTag(stack, tag); + tag.putDouble("force_stop", 1); } if (cap != null) { @@ -66,7 +66,7 @@ public record FireMessage(int msgType) implements CustomPacketPayload { if (cap != null) cap.syncPlayerVariables(player); return; } - specialFireWeapon.fireOnPress(player, tag); + specialFireWeapon.fireOnPress(player, data); if (cap != null) { cap.holdFire = true; @@ -81,17 +81,16 @@ public record FireMessage(int msgType) implements CustomPacketPayload { // 松开开火 if (stack.getItem() instanceof SpecialFireWeapon specialFireWeapon) { - specialFireWeapon.fireOnRelease(player, tag); + specialFireWeapon.fireOnRelease(player, data); } } - - NBTTool.saveTag(stack, tag); + data.save(); } - private static void handleGunBolt(Player player, ItemStack stack, CompoundTag tag) { + private static void handleGunBolt(Player player, ItemStack stack) { if (!stack.is(ModTags.Items.GUN)) return; var data = GunData.from(stack); - tag = data.getTag(); + CompoundTag tag = data.getTag(); if (data.boltActionTime() > 0 && data.getAmmo() > (stack.is(ModTags.Items.REVOLVER) ? -1 : 0)