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 faae60c46..6a3116d1b 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/overlay/AmmoBarOverlay.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/overlay/AmmoBarOverlay.java @@ -3,13 +3,10 @@ package com.atsuishio.superbwarfare.client.overlay; import com.atsuishio.superbwarfare.Mod; import com.atsuishio.superbwarfare.config.client.DisplayConfig; import com.atsuishio.superbwarfare.entity.vehicle.base.ArmedVehicleEntity; -import com.atsuishio.superbwarfare.init.ModAttachments; import com.atsuishio.superbwarfare.init.ModItems; import com.atsuishio.superbwarfare.init.ModKeyMappings; -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.AmmoType; import com.atsuishio.superbwarfare.tools.InventoryTool; import com.atsuishio.superbwarfare.tools.NBTTool; import com.mojang.blaze3d.vertex.PoseStack; @@ -48,12 +45,13 @@ public class AmmoBarOverlay implements LayeredDraw.Layer { private static int getGunAmmoCount(Player player) { ItemStack stack = player.getMainHandItem(); + // TODO 替换为直接使用背包弹药判断 if (stack.getItem() == ModItems.MINIGUN.get()) { - return player.getData(ModAttachments.PLAYER_VARIABLE).rifleAmmo; + return GunData.from(stack).countAmmo(player); } if (stack.getItem() == ModItems.BOCEK.get()) { - return GunData.from(stack).maxAmmo.get(); + return GunData.from(stack).countAmmo(player); } return GunData.from(stack).ammo.get(); @@ -66,25 +64,9 @@ public class AmmoBarOverlay implements LayeredDraw.Layer { return ""; } - var cap = player.getData(ModAttachments.PLAYER_VARIABLE); if (!hasCreativeAmmo()) { var data = GunData.from(stack); - if (stack.is(ModTags.Items.LAUNCHER) || stack.getItem() == ModItems.TASER.get()) { - return "" + data.maxAmmo.get(); - } - var ammoTypeInfo = data.ammoTypeInfo(); - return switch (ammoTypeInfo.type()) { - case PLAYER_AMMO -> { - var type = AmmoType.getType(ammoTypeInfo.value()); - assert type != null; - - yield type.get(cap) + ""; - } - - // TODO 正确计算弹药数量 - case ITEM, TAG -> "" + data.maxAmmo.get(); - default -> ""; - }; + return data.countAmmo(player) + ""; } return "∞"; 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 6d3df0e27..f89dfd3ea 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 @@ -91,7 +91,7 @@ public class BocekItemRenderer extends GeoItemRenderer { } if (name.equals("jian")) { - bone.setHidden(GunData.from(itemStack).maxAmmo.get() == 0); + bone.setHidden(!GunData.from(itemStack).hasAmmo(player)); } if (renderingArms) { diff --git a/src/main/java/com/atsuishio/superbwarfare/event/GunEventHandler.java b/src/main/java/com/atsuishio/superbwarfare/event/GunEventHandler.java index 27012b0e6..b074670bc 100644 --- a/src/main/java/com/atsuishio/superbwarfare/event/GunEventHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/event/GunEventHandler.java @@ -452,7 +452,7 @@ public class GunEventHandler { } // TODO 优化这坨判断 - if (stack.is(ModTags.Items.LAUNCHER) && data.maxAmmo.get() == 0 + if (stack.is(ModTags.Items.LAUNCHER) && !data.hasAmmo(player) || stack.is(ModItems.SECONDARY_CATACLYSM.get()) && data.ammo.get() >= data.magazine() ) { startStage3 = true; diff --git a/src/main/java/com/atsuishio/superbwarfare/event/PlayerEventHandler.java b/src/main/java/com/atsuishio/superbwarfare/event/PlayerEventHandler.java index 1824df177..b9178fced 100644 --- a/src/main/java/com/atsuishio/superbwarfare/event/PlayerEventHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/event/PlayerEventHandler.java @@ -8,7 +8,6 @@ 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.network.message.receive.SimulationDistanceMessage; -import com.atsuishio.superbwarfare.tools.AmmoType; import com.atsuishio.superbwarfare.tools.InventoryTool; import com.atsuishio.superbwarfare.tools.NBTTool; import net.minecraft.resources.ResourceLocation; @@ -16,7 +15,6 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; -import net.minecraft.tags.ItemTags; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.entity.ai.attributes.Attributes; @@ -109,40 +107,7 @@ public class PlayerEventHandler { var data = GunData.from(stack); if (!InventoryTool.hasCreativeAmmoBox(player)) { - var cap = player.getData(ModAttachments.PLAYER_VARIABLE); - var ammoTypeInfo = data.ammoTypeInfo(); - switch (ammoTypeInfo.type()) { - case PLAYER_AMMO -> { - var type = AmmoType.getType(ammoTypeInfo.value()); - assert type != null; - - if (type.get(cap) == 0) { - data.reload(player); - } - } - case ITEM -> { - // TODO 弃用maxAmmo - if (data.ammo.get() == 0 && data.maxAmmo.get() == 0) { - data.ammo.set(1); - player.getInventory().clearOrCountMatchingItems( - p -> p.getItem().toString().equals(ammoTypeInfo.value()), - 1, - player.inventoryMenu.getCraftSlots() - ); - } - } - case TAG -> { - // TODO 弃用maxAmmo - if (data.ammo.get() == 0 && data.maxAmmo.get() == 0) { - data.ammo.set(1); - player.getInventory().clearOrCountMatchingItems( - p -> p.is(ItemTags.create(ResourceLocation.parse(ammoTypeInfo.value()))), - 1, - player.inventoryMenu.getCraftSlots() - ); - } - } - } + data.reload(player); } else { data.ammo.set(data.magazine()); } 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 1b5ebb64d..46d98f9b8 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 @@ -67,7 +67,6 @@ public class GunData { stopped = new BooleanValue(data, "Stopped"); forceStop = new BooleanValue(data, "ForceStop"); loadIndex = new IntValue(data, "LoadIndex"); - maxAmmo = new IntValue(data, "MaxAmmo"); holdOpen = new BooleanValue(data, "HoldOpen"); hideBulletChain = new BooleanValue(data, "HideBulletChain"); draw = new BooleanValue(data, "Draw"); @@ -300,6 +299,10 @@ public class GunData { return new AmmoTypeInfo(AmmoConsumeType.ITEM, ammoType); } + public boolean hasAmmo(Player player) { + return countAmmo(player) > 0; + } + public int countAmmo(Player player) { var info = ammoTypeInfo(); return switch (info.type()) { @@ -404,7 +407,6 @@ public class GunData { public final BooleanValue stopped; public final BooleanValue forceStop; public final IntValue loadIndex; - public final IntValue maxAmmo; public final BooleanValue holdOpen; public final BooleanValue hideBulletChain; 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 e9075614c..0028489cf 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 @@ -106,27 +106,6 @@ public class JavelinItem extends GunItem implements GeoItem, ReleaseSpecialWeapo return this.cache; } - public static int getAmmoCount(Player player) { - int count = 0; - for (var inv : player.getInventory().items) { - if (inv.is(ModItems.CREATIVE_AMMO_BOX.get())) { - count++; - } - } - - if (count == 0) { - int sum = 0; - for (int i = 0; i < player.getInventory().getContainerSize(); ++i) { - ItemStack itemstack = player.getInventory().getItem(i); - if (check(itemstack)) { - sum += itemstack.getCount(); - } - } - return sum; - } - return (int) Double.POSITIVE_INFINITY; - } - @Override public Set getReloadSound() { return Set.of(ModSounds.JAVELIN_RELOAD_EMPTY.get(), ModSounds.JAVELIN_LOCK.get(), ModSounds.JAVELIN_LOCKON.get()); @@ -140,8 +119,6 @@ public class JavelinItem extends GunItem implements GeoItem, ReleaseSpecialWeapo final var tag = data.tag(); if (entity instanceof Player player && selected) { - data.maxAmmo.set(getAmmoCount(player)); - if (tag.getBoolean("Seeking")) { List decoy = SeekTool.seekLivingEntities(player, player.level(), 512, 8); 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 3dd5a6285..b1ed53f77 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 @@ -20,14 +20,12 @@ import net.minecraft.core.particles.ParticleTypes; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundEvent; -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; -import net.minecraft.world.level.Level; import org.jetbrains.annotations.NotNull; import software.bernie.geckolib.animatable.GeoItem; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; @@ -35,7 +33,6 @@ import software.bernie.geckolib.animation.*; import software.bernie.geckolib.renderer.GeoItemRenderer; import software.bernie.geckolib.util.GeckoLibUtil; -import javax.annotation.ParametersAreNonnullByDefault; import java.util.Optional; import java.util.Set; import java.util.function.Supplier; @@ -95,38 +92,6 @@ public class M79Item extends GunItem implements GeoItem, PressFireSpecialWeapon data.add(idleController); } - public static int getAmmoCount(Player player) { - int count = 0; - for (var inv : player.getInventory().items) { - if (inv.is(ModItems.CREATIVE_AMMO_BOX.get())) { - count++; - } - } - - if (count == 0) { - int sum = 0; - for (int i = 0; i < player.getInventory().getContainerSize(); ++i) { - ItemStack itemstack = player.getInventory().getItem(i); - if (check(itemstack)) { - sum += itemstack.getCount(); - } - } - return sum; - } - return (int) Double.POSITIVE_INFINITY; - } - - @Override - @ParametersAreNonnullByDefault - public void inventoryTick(ItemStack stack, Level world, Entity entity, int slot, boolean selected) { - super.inventoryTick(stack, world, entity, slot, selected); - if (entity instanceof Player player) { - var data = GunData.from(stack); - data.maxAmmo.set(getAmmoCount(player)); - data.save(); - } - } - protected static boolean check(ItemStack stack) { return stack.getItem() == ModItems.GRENADE_40MM.get(); } 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 77058802c..4f2305353 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 @@ -98,27 +98,6 @@ public class RpgItem extends GunItem implements GeoItem, PressFireSpecialWeapon return this.cache; } - public static int getAmmoCount(Player player) { - int count = 0; - for (var inv : player.getInventory().items) { - if (inv.is(ModItems.CREATIVE_AMMO_BOX.get())) { - count++; - } - } - - if (count == 0) { - int sum = 0; - for (int i = 0; i < player.getInventory().getContainerSize(); ++i) { - ItemStack itemstack = player.getInventory().getItem(i); - if (check(itemstack)) { - sum += itemstack.getCount(); - } - } - return sum; - } - return (int) Double.POSITIVE_INFINITY; - } - @Override public Set getReloadSound() { return Set.of(ModSounds.RPG_RELOAD_EMPTY.get()); @@ -136,9 +115,6 @@ public class RpgItem extends GunItem implements GeoItem, PressFireSpecialWeapon } } - if (entity instanceof Player player) { - data.maxAmmo.set(getAmmoCount(player)); - } data.save(); super.inventoryTick(stack, world, entity, slot, selected); 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 69ccf7b51..d77dd75e1 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 @@ -14,7 +14,6 @@ import com.atsuishio.superbwarfare.item.gun.PressFireSpecialWeapon; 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.InventoryTool; import com.atsuishio.superbwarfare.tools.ParticleTool; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; @@ -149,32 +148,11 @@ public class SecondaryCataclysm extends GunItem implements GeoItem, PressFireSpe data.add(idleController); } - public static int getAmmoCount(Player player) { - if (InventoryTool.hasCreativeAmmoBox(player)) { - return (int) Double.POSITIVE_INFINITY; - } - - int sum = 0; - for (int i = 0; i < player.getInventory().getContainerSize(); ++i) { - ItemStack itemstack = player.getInventory().getItem(i); - if (check(itemstack)) { - sum += itemstack.getCount(); - } - } - return sum; - } - @Override @ParametersAreNonnullByDefault public void inventoryTick(ItemStack stack, Level world, Entity entity, int slot, boolean selected) { super.inventoryTick(stack, world, entity, slot, selected); - if (entity instanceof Player player) { - var data = GunData.from(stack); - data.maxAmmo.set(getAmmoCount(player)); - data.save(); - } - if (entity instanceof Player player) { for (var cell : player.getInventory().items) { if (cell.is(ModItems.CELL.get())) { 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 d472a4341..97e5db56a 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 @@ -4,7 +4,6 @@ import com.atsuishio.superbwarfare.Mod; import com.atsuishio.superbwarfare.client.renderer.item.BocekItemRenderer; import com.atsuishio.superbwarfare.client.tooltip.component.BocekImageComponent; import com.atsuishio.superbwarfare.event.ClientEventHandler; -import com.atsuishio.superbwarfare.init.ModItems; import com.atsuishio.superbwarfare.init.ModPerks; import com.atsuishio.superbwarfare.init.ModSounds; import com.atsuishio.superbwarfare.item.gun.GunItem; @@ -86,26 +85,6 @@ public class BocekItem extends GunItem implements GeoItem, ReleaseSpecialWeapon return this.cache; } - public static int getAmmoCount(Player player) { - int count = 0; - for (var inv : player.getInventory().items) { - if (inv.is(ModItems.CREATIVE_AMMO_BOX.get())) { - count++; - } - } - - if (count == 0) { - int sum = 0; - for (int i = 0; i < player.getInventory().getContainerSize(); ++i) { - ItemStack itemstack = player.getInventory().getItem(i); - if (check(itemstack)) { - sum += itemstack.getCount(); - } - } - return sum; - } - return (int) Double.POSITIVE_INFINITY; - } @Override @ParametersAreNonnullByDefault @@ -113,10 +92,6 @@ public class BocekItem extends GunItem implements GeoItem, ReleaseSpecialWeapon super.inventoryTick(stack, world, entity, slot, selected); var data = GunData.from(stack); final var tag = data.tag(); - if (entity instanceof Player player) { - data.maxAmmo.set(getAmmoCount(player)); - data.save(); - } if (GunsTool.getGunIntTag(tag, "ArrowEmpty") > 0) { GunsTool.setGunIntTag(tag, "ArrowEmpty", GunsTool.getGunIntTag(tag, "ArrowEmpty") - 1); 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 083b4b720..a62d3fa41 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 @@ -113,26 +113,6 @@ public class TaserItem extends GunItem implements GeoItem, EnergyStorageItem, Pr return this.cache; } - public static int getAmmoCount(Player player) { - int count = 0; - for (var inv : player.getInventory().items) { - if (inv.is(ModItems.CREATIVE_AMMO_BOX.get())) { - count++; - } - } - - if (count == 0) { - int sum = 0; - for (int i = 0; i < player.getInventory().getContainerSize(); ++i) { - ItemStack itemstack = player.getInventory().getItem(i); - if (check(itemstack)) { - sum += itemstack.getCount(); - } - } - return sum; - } - return (int) Double.POSITIVE_INFINITY; - } @Override @ParametersAreNonnullByDefault @@ -140,11 +120,6 @@ public class TaserItem extends GunItem implements GeoItem, EnergyStorageItem, Pr super.inventoryTick(stack, world, entity, slot, selected); var data = GunData.from(stack); - if (entity instanceof Player player) { - data.maxAmmo.set(getAmmoCount(player)); - data.save(); - } - int perkLevel = data.perk.getLevel(ModPerks.REGENERATION); var stackStorage = stack.getCapability(Capabilities.EnergyStorage.ITEM); 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 231daeb8e..868e36506 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 @@ -9,7 +9,6 @@ import com.atsuishio.superbwarfare.init.ModTags; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.item.gun.ReleaseSpecialWeapon; import com.atsuishio.superbwarfare.item.gun.data.GunData; -import com.atsuishio.superbwarfare.item.gun.special.BocekItem; import com.atsuishio.superbwarfare.perk.AmmoPerk; import com.atsuishio.superbwarfare.perk.Perk; import io.netty.buffer.ByteBuf; @@ -67,11 +66,7 @@ public record FireMessage(int msgType, double power, boolean zoom) implements Cu } else if (type == 1) { // 松开开火 if (stack.getItem() instanceof ReleaseSpecialWeapon releaseSpecialWeapon) { - if (releaseSpecialWeapon instanceof BocekItem) { - releaseSpecialWeapon.fireOnRelease(player, data, power, zoom); - } else { - releaseSpecialWeapon.fireOnRelease(player, data, 0, zoom); - } + releaseSpecialWeapon.fireOnRelease(player, data, power, zoom); } } cap.sync(player); 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 a5292b38e..c82427cde 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 @@ -61,10 +61,7 @@ public record ReloadMessage(int msgType) implements CustomPacketPayload { assert ammoType != null; if (ammoType.get(cap) == 0) return; - } else if ((ammoTypeInfo.type() == GunData.AmmoConsumeType.ITEM || ammoTypeInfo.type() == GunData.AmmoConsumeType.TAG) - // TODO 弃用maxAmmo - && data.maxAmmo.get() == 0 - ) { + } else if ((ammoTypeInfo.type() == GunData.AmmoConsumeType.ITEM || ammoTypeInfo.type() == GunData.AmmoConsumeType.TAG) && !data.hasAmmo(player)) { return; } } 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 af5c54e29..270e7595c 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 @@ -97,7 +97,7 @@ public record ShootMessage(double spread, boolean zoom) implements CustomPacketP } else if (stack.is(ModItems.MINIGUN.get())) { var cap = player.getData(ModAttachments.PLAYER_VARIABLE).watch(); - if (cap.rifleAmmo > 0 || InventoryTool.hasCreativeAmmoBox(player)) { + if (data.hasAmmo(player) || InventoryTool.hasCreativeAmmoBox(player)) { tag.putDouble("heat", (tag.getDouble("heat") + 0.1)); if (tag.getDouble("heat") >= 50.5) { tag.putDouble("overheat", 40); @@ -124,7 +124,7 @@ public record ShootMessage(double spread, boolean zoom) implements CustomPacketP GunEventHandler.gunShoot(player, data, spared, false); if (!InventoryTool.hasCreativeAmmoBox(player)) { - cap.rifleAmmo = cap.rifleAmmo - 1; + data.consumeAmmo(player, 1); player.setData(ModAttachments.PLAYER_VARIABLE, cap); cap.sync(player); }