diff --git a/src/main/java/com/atsuishio/superbwarfare/client/ClickHandler.java b/src/main/java/com/atsuishio/superbwarfare/client/ClickHandler.java index b920eb4ea..d57c96d3c 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/ClickHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/ClickHandler.java @@ -9,6 +9,7 @@ import com.atsuishio.superbwarfare.entity.vehicle.base.VehicleEntity; import com.atsuishio.superbwarfare.entity.vehicle.base.WeaponVehicleEntity; import com.atsuishio.superbwarfare.event.ClientEventHandler; import com.atsuishio.superbwarfare.init.*; +import com.atsuishio.superbwarfare.item.gun.GunData; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.network.message.send.*; import com.atsuishio.superbwarfare.perk.PerkHelper; @@ -164,9 +165,10 @@ public class ClickHandler { var tag = NBTTool.getTag(stack); if (stack.is(ModTags.Items.GUN) && ClientEventHandler.zoom) { - if (GunsTool.getGunBooleanTag(tag, "CanSwitchScope")) { + var data = GunData.from(stack); + if (data.canSwitchScope()) { PacketDistributor.sendToServer(new SwitchScopeMessage(scroll)); - } else if (tag.getBoolean("CanAdjustZoomFov") || stack.is(ModItems.MINIGUN.get())) { + } else if (data.canAdjustZoom() || stack.is(ModItems.MINIGUN.get())) { PacketDistributor.sendToServer(new AdjustZoomFovMessage(scroll)); } event.setCanceled(true); @@ -210,7 +212,7 @@ public class ClickHandler { // } if (key == ModKeyMappings.RELOAD.getKey().getValue()) { - ClientEventHandler.burstFireSize = 0; + ClientEventHandler.burstFireAmount = 0; PacketDistributor.sendToServer(new ReloadMessage(0)); } if (key == ModKeyMappings.FIRE_MODE.getKey().getValue()) { @@ -222,7 +224,7 @@ public class ClickHandler { if (key == ModKeyMappings.DISMOUNT.getKey().getValue()) { handleDismountPress(player); } - if (key == ModKeyMappings.EDIT_MODE.getKey().getValue() && ClientEventHandler.burstFireSize == 0) { + if (key == ModKeyMappings.EDIT_MODE.getKey().getValue() && ClientEventHandler.burstFireAmount == 0) { ClientEventHandler.holdFire = false; PacketDistributor.sendToServer(new EditModeMessage(0)); } @@ -325,42 +327,31 @@ public class ClickHandler { ClientEventHandler.holdFire = true; } - var tag = NBTTool.getTag(stack); if (stack.getItem() instanceof GunItem gunItem && !(player.getVehicle() != null - && player.getVehicle() instanceof CannonEntity) && clientTimer.getProgress() == 0 && cantFireTime == 0 - && (!(tag.getBoolean("is_normal_reloading") || tag.getBoolean("is_empty_reloading")) - && !GunsTool.getGunBooleanTag(tag, "Reloading") - && !GunsTool.getGunBooleanTag(tag, "Charging") - && !GunsTool.getGunBooleanTag(tag, "NeedBoltAction")) + && player.getVehicle() instanceof CannonEntity) + && clientTimer.getProgress() == 0 && cantFireTime == 0 - && drawTime < 0.01 && !notInGame() ) { - if ((!(tag.getBoolean("is_normal_reloading") || tag.getBoolean("is_empty_reloading")) - && !GunsTool.getGunBooleanTag(tag, "Reloading") - && !GunsTool.getGunBooleanTag(tag, "Charging") - && !GunsTool.getGunBooleanTag(tag, "NeedBoltAction")) - && cantFireTime == 0 - && drawTime < 0.01 - && !notInGame()) { - player.playSound(ModSounds.TRIGGER_CLICK.get(), 1, 1); - } + var data = GunData.from(stack); + var tag = data.getTag(); + player.playSound(ModSounds.TRIGGER_CLICK.get(), 1, 1); - if (!gunItem.useBackpackAmmo(stack) && GunsTool.getGunIntTag(tag, "Ammo") <= 0 && GunsTool.getGunIntTag(tag, "ReloadTime") == 0) { + if (!gunItem.useBackpackAmmo(stack) && data.getAmmo() <= 0 && GunsTool.getGunIntTag(tag, "ReloadTime") == 0) { if (ReloadConfig.LEFT_CLICK_RELOAD.get()) { PacketDistributor.sendToServer(new ReloadMessage(0)); - ClientEventHandler.burstFireSize = 0; + ClientEventHandler.burstFireAmount = 0; } } else { PacketDistributor.sendToServer(new FireMessage(0)); - if ((!(tag.getBoolean("is_normal_reloading") || tag.getBoolean("is_empty_reloading")) - && !GunsTool.getGunBooleanTag(tag, "Reloading") + if ((!(data.normalReloading() || data.emptyReloading()) + && !data.isReloading() && !GunsTool.getGunBooleanTag(tag, "Charging") && !GunsTool.getGunBooleanTag(tag, "NeedBoltAction")) && drawTime < 0.01) { - if (GunsTool.getGunIntTag(tag, "FireMode") == 1) { - if (ClientEventHandler.burstFireSize == 0) { - ClientEventHandler.burstFireSize = GunsTool.getGunIntTag(tag, "BurstSize"); + if (data.getFireMode() == 1) { + if (ClientEventHandler.burstFireAmount == 0) { + ClientEventHandler.burstFireAmount = data.burstAmount(); } } else { if (!stack.is(ModItems.BOCEK.get())) { diff --git a/src/main/java/com/atsuishio/superbwarfare/client/PoseTool.java b/src/main/java/com/atsuishio/superbwarfare/client/PoseTool.java index c9844888a..5d40340b0 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/PoseTool.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/PoseTool.java @@ -1,5 +1,6 @@ package com.atsuishio.superbwarfare.client; +import com.atsuishio.superbwarfare.item.gun.GunData; import com.atsuishio.superbwarfare.tools.GunsTool; import com.atsuishio.superbwarfare.tools.NBTTool; import net.minecraft.client.model.HumanoidModel; @@ -14,10 +15,12 @@ public class PoseTool { public static HumanoidModel.ArmPose pose(LivingEntity entityLiving, InteractionHand hand, ItemStack stack) { var tag = NBTTool.getTag(stack); - if (tag.getBoolean("is_empty_reloading") - || tag.getBoolean("is_normal_reloading") - || GunsTool.getGunBooleanTag(tag, "Reloading") - || GunsTool.getGunBooleanTag(tag, "Charging")) { + var data = GunData.from(stack); + if (data.emptyReloading() + || data.getReloadState() == GunData.ReloadState.NORMAL_RELOADING + || data.isReloading() + || GunsTool.getGunBooleanTag(tag, "Charging") + ) { return HumanoidModel.ArmPose.CROSSBOW_CHARGE; } else if (entityLiving.isSprinting() && entityLiving.onGround() && entityLiving.getPersistentData().getDouble("noRun") == 0) { return HumanoidModel.ArmPose.CROSSBOW_CHARGE; 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 3ea987dac..b035b4f93 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 @@ -4,6 +4,7 @@ import com.atsuishio.superbwarfare.Mod; import com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay; import com.atsuishio.superbwarfare.event.ClientEventHandler; import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.GunData; import com.atsuishio.superbwarfare.item.gun.sniper.K98Item; import com.atsuishio.superbwarfare.tools.GunsTool; import com.atsuishio.superbwarfare.tools.NBTTool; @@ -44,7 +45,8 @@ public class K98ItemModel extends GeoModel { 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(); if (NBTTool.getTag(stack).getDouble("prepare") > 11 && GunsTool.getGunIntTag(tag, "Ammo") == 1) { clip.setScaleX(0); clip.setScaleY(0); @@ -108,7 +110,7 @@ public class K98ItemModel extends GeoModel { float numR = (float) (1 - 0.52 * zt); float numP = (float) (1 - 0.58 * zt); - if (GunsTool.getGunIntTag(tag, "ReloadTime") > 0 || GunsTool.getGunBooleanTag(tag, "Reloading")) { + if (GunsTool.getGunIntTag(tag, "ReloadTime") > 0 || data.isReloading()) { main.setRotX(numR * main.getRotX()); main.setRotY(numR * main.getRotY()); main.setRotZ(numR * main.getRotZ()); diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/item/M870ItemModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/item/M870ItemModel.java index b9a5b8a1b..897cdf6c4 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/model/item/M870ItemModel.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/item/M870ItemModel.java @@ -4,9 +4,8 @@ import com.atsuishio.superbwarfare.Mod; import com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay; import com.atsuishio.superbwarfare.event.ClientEventHandler; import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.GunData; import com.atsuishio.superbwarfare.item.gun.shotgun.M870Item; -import com.atsuishio.superbwarfare.tools.GunsTool; -import com.atsuishio.superbwarfare.tools.NBTTool; import net.minecraft.client.Minecraft; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; @@ -100,8 +99,7 @@ public class M870ItemModel extends GeoModel { float numR = (float) (1 - 0.72 * zt); float numP = (float) (1 - 0.82 * zt); - final var tag = NBTTool.getTag(stack); - if (GunsTool.getGunBooleanTag(tag, "Reloading")) { + if (GunData.from(stack).isReloading()) { main.setRotX(numR * main.getRotX()); main.setRotY(numR * main.getRotY()); main.setRotZ(numR * main.getRotZ()); 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 56e73a00e..1679f11ee 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 @@ -4,8 +4,8 @@ import com.atsuishio.superbwarfare.Mod; import com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay; import com.atsuishio.superbwarfare.event.ClientEventHandler; import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.GunData; import com.atsuishio.superbwarfare.item.gun.rifle.MarlinItem; -import com.atsuishio.superbwarfare.tools.GunsTool; import com.atsuishio.superbwarfare.tools.NBTTool; import net.minecraft.client.Minecraft; import net.minecraft.resources.ResourceLocation; @@ -101,8 +101,7 @@ public class MarlinItemModel extends GeoModel { float numR = (float) (1 - 0.55 * zt); float numP = (float) (1 - 0.88 * zt); - final var tag = NBTTool.getTag(stack); - if (GunsTool.getGunBooleanTag(tag, "Reloading")) { + if (GunData.from(stack).isReloading()) { main.setRotX(numR * main.getRotX()); main.setRotY(numR * main.getRotY()); main.setRotZ(numR * main.getRotZ()); diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/item/MinigunItemModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/item/MinigunItemModel.java index a1bc72ef5..c42fea38b 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/model/item/MinigunItemModel.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/item/MinigunItemModel.java @@ -4,9 +4,8 @@ import com.atsuishio.superbwarfare.Mod; import com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay; import com.atsuishio.superbwarfare.event.ClientEventHandler; import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.GunData; import com.atsuishio.superbwarfare.item.gun.machinegun.MinigunItem; -import com.atsuishio.superbwarfare.tools.GunsTool; -import com.atsuishio.superbwarfare.tools.NBTTool; import net.minecraft.client.Minecraft; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; @@ -59,8 +58,7 @@ public class MinigunItemModel extends GeoModel { double fp = ClientEventHandler.firePos; double fr = ClientEventHandler.fireRot; - final var tag = NBTTool.getTag(stack); - int rpm = GunsTool.getGunIntTag(tag, "RPM"); + int rpm = GunData.from(stack).rpm(); gun.setRotZ(gun.getRotZ() + times * -0.07f * ((float) rpm / 1200) * ClientEventHandler.miniGunRot); diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/item/MosinNagantItemModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/item/MosinNagantItemModel.java index 30f85f8f5..3fe8cb197 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/model/item/MosinNagantItemModel.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/item/MosinNagantItemModel.java @@ -4,6 +4,7 @@ import com.atsuishio.superbwarfare.Mod; import com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay; import com.atsuishio.superbwarfare.event.ClientEventHandler; import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.GunData; import com.atsuishio.superbwarfare.item.gun.sniper.MosinNagantItem; import com.atsuishio.superbwarfare.tools.GunsTool; import com.atsuishio.superbwarfare.tools.NBTTool; @@ -86,7 +87,8 @@ public class MosinNagantItemModel extends GeoModel { qiangshen.setScaleZ(1); } - final var tag = NBTTool.getTag(stack); + var data = GunData.from(stack); + final var tag = data.getTag(); tag.putBoolean("HoloHidden", !(gun.getPosX() > 1.4)); NBTTool.saveTag(stack, tag); @@ -124,7 +126,7 @@ public class MosinNagantItemModel extends GeoModel { float numR = (float) (1 - 0.97 * zt); float numP = (float) (1 - 0.81 * zt); - if (GunsTool.getGunBooleanTag(tag, "Reloading") || GunsTool.getGunIntTag(tag, "BoltActionTick") > 0) { + if (data.isReloading() || GunsTool.getGunIntTag(tag, "BoltActionTick") > 0) { main.setRotX(numR * main.getRotX()); main.setRotY(numR * main.getRotY()); main.setRotZ(numR * main.getRotZ()); diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/item/Qbz95ItemModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/item/Qbz95ItemModel.java index f194cc228..87da8a874 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/model/item/Qbz95ItemModel.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/item/Qbz95ItemModel.java @@ -5,6 +5,7 @@ import com.atsuishio.superbwarfare.client.AnimationHelper; import com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay; import com.atsuishio.superbwarfare.event.ClientEventHandler; import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.GunData; import com.atsuishio.superbwarfare.item.gun.rifle.Qbz95Item; import com.atsuishio.superbwarfare.tools.GunsTool; import com.atsuishio.superbwarfare.tools.NBTTool; @@ -203,7 +204,7 @@ public class Qbz95ItemModel extends GeoModel { lHandRotZ = Mth.lerp(1.5f * times, lHandRotZ, isZooming ? 2.9228f : leftHand.getRotZ()); - if (NBTTool.getTag(stack).getBoolean("is_empty_reloading")) { + if (GunData.from(stack).emptyReloading()) { leftHand.setPosX(lHandPosX); leftHand.setPosY(lHandPosY); leftHand.setPosZ(lHandPosZ); 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 aa42d5910..4824e17d1 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 @@ -5,6 +5,7 @@ import com.atsuishio.superbwarfare.client.AnimationHelper; import com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay; import com.atsuishio.superbwarfare.event.ClientEventHandler; import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.GunData; import com.atsuishio.superbwarfare.item.gun.handgun.Trachelium; import com.atsuishio.superbwarfare.tools.GunsTool; import com.atsuishio.superbwarfare.tools.NBTTool; @@ -163,7 +164,7 @@ public class TracheliumItemModel extends GeoModel { ammo.setRotZ(60 * Mth.DEG_TO_RAD * (float) ClientEventHandler.revolverWheelPreTime); ammohole.setRotZ(-60 * Mth.DEG_TO_RAD * (float) ClientEventHandler.revolverWheelPreTime); - if (NBTTool.getTag(stack).getBoolean("is_empty_reloading")) { + if (GunData.from(stack).emptyReloading()) { lun.setRotZ(0); ammo.setRotZ(0); ammohole.setRotZ(0); 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 03f89b959..f2b7f3ffb 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/overlay/AmmoBarOverlay.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/overlay/AmmoBarOverlay.java @@ -9,6 +9,7 @@ import com.atsuishio.superbwarfare.init.ModItems; import com.atsuishio.superbwarfare.init.ModKeyMappings; import com.atsuishio.superbwarfare.init.ModTags; import com.atsuishio.superbwarfare.item.common.ammo.AmmoSupplierItem; +import com.atsuishio.superbwarfare.item.gun.GunData; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.tools.AmmoType; import com.atsuishio.superbwarfare.tools.GunsTool; @@ -21,7 +22,6 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; -import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.FastColor; @@ -64,6 +64,7 @@ public class AmmoBarOverlay { final var tag = NBTTool.getTag(stack); if (stack.getItem() instanceof GunItem gunItem && !(player.getVehicle() instanceof ArmedVehicleEntity vehicle && vehicle.banHand(player))) { PoseStack poseStack = event.getGuiGraphics().pose(); + var data = GunData.from(stack); // 渲染图标 event.getGuiGraphics().blit(gunItem.getGunIcon(), @@ -89,7 +90,7 @@ public class AmmoBarOverlay { } // 渲染开火模式 - ResourceLocation fireMode = getFireMode(tag); + ResourceLocation fireMode = getFireMode(data); if (stack.getItem() == ModItems.JAVELIN.get()) { fireMode = tag.getBoolean("TopMode") ? TOP : DIR; @@ -100,7 +101,7 @@ public class AmmoBarOverlay { // 渲染加特林射速 event.getGuiGraphics().drawString( Minecraft.getInstance().font, - GunsTool.getGunIntTag(tag, "RPM") + " RPM", + data.rpm() + " RPM", w - 111f, h - 20, 0xFFFFFF, @@ -389,8 +390,8 @@ public class AmmoBarOverlay { poseStack.popPose(); } - private static ResourceLocation getFireMode(CompoundTag tag) { - return switch (GunsTool.getGunIntTag(tag, "FireMode")) { + private static ResourceLocation getFireMode(GunData data) { + return switch (data.getFireMode()) { case 1 -> BURST; case 2 -> AUTO; default -> SEMI; diff --git a/src/main/java/com/atsuishio/superbwarfare/client/tooltip/ClientBocekImageTooltip.java b/src/main/java/com/atsuishio/superbwarfare/client/tooltip/ClientBocekImageTooltip.java index 16a1258d6..2c21e1efa 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/tooltip/ClientBocekImageTooltip.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/tooltip/ClientBocekImageTooltip.java @@ -6,7 +6,6 @@ import com.atsuishio.superbwarfare.perk.AmmoPerk; import com.atsuishio.superbwarfare.perk.Perk; import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.tools.FormatTool; -import com.atsuishio.superbwarfare.tools.GunsTool; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; @@ -20,12 +19,12 @@ public class ClientBocekImageTooltip extends ClientGunImageTooltip { protected Component getDamageComponent() { boolean slug = false; - var perk = PerkHelper.getPerkByType(tag, Perk.Type.AMMO); + var perk = PerkHelper.getPerkByType(data, Perk.Type.AMMO); if (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug) { slug = true; } - double total = GunsTool.getGunDoubleTag(tag, "Damage") * TooltipTool.perkDamage(stack); + double total = data.damage() * TooltipTool.perkDamage(stack); if (slug) { return Component.translatable("des.superbwarfare.guns.damage").withStyle(ChatFormatting.GRAY) diff --git a/src/main/java/com/atsuishio/superbwarfare/client/tooltip/ClientCellImageTooltip.java b/src/main/java/com/atsuishio/superbwarfare/client/tooltip/ClientCellImageTooltip.java index 93beed603..e7dc542b8 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/tooltip/ClientCellImageTooltip.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/tooltip/ClientCellImageTooltip.java @@ -4,16 +4,25 @@ import com.atsuishio.superbwarfare.client.tooltip.component.GunImageComponent; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.util.Mth; +import net.minecraft.world.item.ItemStack; import net.neoforged.neoforge.capabilities.Capabilities; import org.jetbrains.annotations.NotNull; -public class ClientCellImageTooltip extends ClientGunImageTooltip { +public class ClientCellImageTooltip implements ClientTooltipComponent { + + protected final int width; + protected final int height; + protected final ItemStack stack; public ClientCellImageTooltip(GunImageComponent tooltip) { - super(tooltip); + this.width = tooltip.width; + this.height = tooltip.height; + this.stack = tooltip.stack; } @Override @@ -67,14 +76,20 @@ public class ClientCellImageTooltip extends ClientGunImageTooltip { @Override public int getHeight() { - int height = super.getHeight(); + int height = 20; if (shouldRenderEnergyTooltip()) height -= 10; return height; } @Override public int getWidth(@NotNull Font font) { - int width = super.getWidth(font); + int width; + if (Screen.hasShiftDown()) { + width = Math.max(this.width, 20); + } else { + width = 20; + } + if (shouldRenderEnergyTooltip()) width = Math.max(width, font.width(getEnergyComponent().getVisualOrderText()) + 10); return width; diff --git a/src/main/java/com/atsuishio/superbwarfare/client/tooltip/ClientChargingStationImageTooltip.java b/src/main/java/com/atsuishio/superbwarfare/client/tooltip/ClientChargingStationImageTooltip.java index 56d322223..caa53ab8a 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/tooltip/ClientChargingStationImageTooltip.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/tooltip/ClientChargingStationImageTooltip.java @@ -5,19 +5,27 @@ import com.atsuishio.superbwarfare.item.ChargingStationBlockItem; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; import net.minecraft.core.component.DataComponents; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.util.Mth; +import net.minecraft.world.item.ItemStack; import org.jetbrains.annotations.NotNull; -public class ClientChargingStationImageTooltip extends ClientGunImageTooltip { +public class ClientChargingStationImageTooltip implements ClientTooltipComponent { + + protected final int width; + protected final int height; + protected final ItemStack stack; public ClientChargingStationImageTooltip(GunImageComponent tooltip) { - super(tooltip); + this.width = tooltip.width; + this.height = tooltip.height; + this.stack = tooltip.stack; } - @Override public void renderImage(@NotNull Font font, int x, int y, GuiGraphics guiGraphics) { guiGraphics.pose().pushPose(); @@ -62,11 +70,14 @@ public class ClientChargingStationImageTooltip extends ClientGunImageTooltip { @Override public int getHeight() { - return super.getHeight() - 10; + return Math.max(20, this.height) - 10; } @Override public int getWidth(@NotNull Font font) { - return Math.max(super.getWidth(font), font.width(getEnergyComponent().getVisualOrderText()) + 10); + if (Screen.hasShiftDown()) { + return Math.max(this.width, 20); + } + return 20; } } diff --git a/src/main/java/com/atsuishio/superbwarfare/client/tooltip/ClientGunImageTooltip.java b/src/main/java/com/atsuishio/superbwarfare/client/tooltip/ClientGunImageTooltip.java index f2a2726a4..bc92aad48 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/tooltip/ClientGunImageTooltip.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/tooltip/ClientGunImageTooltip.java @@ -4,12 +4,12 @@ import com.atsuishio.superbwarfare.client.TooltipTool; import com.atsuishio.superbwarfare.client.tooltip.component.GunImageComponent; import com.atsuishio.superbwarfare.init.ModKeyMappings; import com.atsuishio.superbwarfare.init.ModPerks; +import com.atsuishio.superbwarfare.item.gun.GunData; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.perk.AmmoPerk; import com.atsuishio.superbwarfare.perk.Perk; import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.tools.FormatTool; -import com.atsuishio.superbwarfare.tools.GunsTool; import com.atsuishio.superbwarfare.tools.NBTTool; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.Font; @@ -27,13 +27,13 @@ public class ClientGunImageTooltip implements ClientTooltipComponent { protected final int width; protected final int height; protected final ItemStack stack; - protected final CompoundTag tag; + protected final GunData data; public ClientGunImageTooltip(GunImageComponent tooltip) { this.width = tooltip.width; this.height = tooltip.height; this.stack = tooltip.stack; - this.tag = NBTTool.getTag(stack).copy(); + this.data = GunData.from(stack); } @Override @@ -65,7 +65,7 @@ public class ClientGunImageTooltip implements ClientTooltipComponent { } protected boolean shouldRenderBypassAndHeadshotTooltip() { - return GunsTool.getGunDoubleTag(tag, "BypassesArmor") > 0 || GunsTool.getGunDoubleTag(tag, "Headshot") > 0; + return data.bypassArmor() > 0 || data.headshot() > 0; } protected boolean shouldRenderEditTooltip() { @@ -76,7 +76,9 @@ public class ClientGunImageTooltip implements ClientTooltipComponent { } protected boolean shouldRenderPerks() { - return PerkHelper.getPerkByType(tag, Perk.Type.AMMO) != null || PerkHelper.getPerkByType(tag, Perk.Type.DAMAGE) != null || PerkHelper.getPerkByType(tag, Perk.Type.FUNCTIONAL) != null; + return PerkHelper.getPerkByType(data, Perk.Type.AMMO) != null + || PerkHelper.getPerkByType(data, Perk.Type.DAMAGE) != null + || PerkHelper.getPerkByType(data, Perk.Type.FUNCTIONAL) != null; } /** @@ -92,7 +94,7 @@ public class ClientGunImageTooltip implements ClientTooltipComponent { * 获取武器伤害的文本组件 */ protected Component getDamageComponent() { - double damage = GunsTool.getGunDoubleTag(tag, "Damage") * TooltipTool.perkDamage(stack); + double damage = data.damage() * TooltipTool.perkDamage(stack); return Component.translatable("des.superbwarfare.guns.damage").withStyle(ChatFormatting.GRAY) .append(Component.literal("").withStyle(ChatFormatting.RESET)) .append(Component.literal(FormatTool.format1D(damage) + (TooltipTool.heBullet(stack) ? " + " @@ -106,7 +108,7 @@ public class ClientGunImageTooltip implements ClientTooltipComponent { if (this.stack.getItem() instanceof GunItem gunItem && gunItem.isAutoWeapon(this.stack)) { return Component.translatable("des.superbwarfare.guns.rpm").withStyle(ChatFormatting.GRAY) .append(Component.literal("").withStyle(ChatFormatting.RESET)) - .append(Component.literal(FormatTool.format0D(GunsTool.getGunIntTag(tag, "RPM"))) + .append(Component.literal(FormatTool.format0D(data.rpm())) .withStyle(ChatFormatting.GREEN)); } return Component.literal(""); @@ -125,8 +127,8 @@ public class ClientGunImageTooltip implements ClientTooltipComponent { * 获取武器等级文本组件 */ protected Component getLevelComponent() { - int level = GunsTool.getGunIntTag(tag, "Level"); - double rate = GunsTool.getGunDoubleTag(tag, "Exp") / (20 * Math.pow(level, 2) + 160 * level + 20); + int level = data.getLevel(); + double rate = data.getExp() / (20 * Math.pow(level, 2) + 160 * level + 20); ChatFormatting formatting; if (level < 10) { @@ -152,7 +154,7 @@ public class ClientGunImageTooltip implements ClientTooltipComponent { * 获取武器强化点数文本组件 */ protected Component getUpgradePointComponent() { - int upgradePoint = Mth.floor(GunsTool.getGunDoubleTag(tag, "UpgradePoint")); + int upgradePoint = Mth.floor(data.getUpgradePoint()); return Component.translatable("des.superbwarfare.guns.upgrade_point").withStyle(ChatFormatting.GRAY) .append(Component.literal("").withStyle(ChatFormatting.RESET)) .append(Component.literal(String.valueOf(upgradePoint)).withStyle(ChatFormatting.WHITE).withStyle(ChatFormatting.BOLD)); @@ -172,13 +174,13 @@ public class ClientGunImageTooltip implements ClientTooltipComponent { */ protected Component getBypassComponent() { double perkBypassArmorRate = 0; - var perk = PerkHelper.getPerkByType(tag, Perk.Type.AMMO); + var perk = PerkHelper.getPerkByType(data, Perk.Type.AMMO); if (perk instanceof AmmoPerk ammoPerk) { - int level = PerkHelper.getItemPerkLevel(perk, tag); + int level = PerkHelper.getItemPerkLevel(perk, data); perkBypassArmorRate = ammoPerk.bypassArmorRate + (perk == ModPerks.AP_BULLET.get() ? 0.05f * (level - 1) : 0); } - double bypassRate = Math.max(GunsTool.getGunDoubleTag(tag, "BypassesArmor") + perkBypassArmorRate, 0); + double bypassRate = Math.max(data.bypassArmor() + perkBypassArmorRate, 0); return Component.translatable("des.superbwarfare.guns.bypass").withStyle(ChatFormatting.GRAY) .append(Component.literal("").withStyle(ChatFormatting.RESET)) @@ -189,7 +191,7 @@ public class ClientGunImageTooltip implements ClientTooltipComponent { * 获取武器爆头倍率文本组件 */ protected Component getHeadshotComponent() { - double headshot = GunsTool.getGunDoubleTag(tag, "Headshot"); + double headshot = data.headshot(); return Component.translatable("des.superbwarfare.guns.headshot").withStyle(ChatFormatting.GRAY) .append(Component.literal("").withStyle(ChatFormatting.RESET)) .append(Component.literal(FormatTool.format1D(headshot, "x")).withStyle(ChatFormatting.AQUA)); @@ -218,32 +220,32 @@ public class ClientGunImageTooltip implements ClientTooltipComponent { int xOffset = -20; - Perk ammoPerk = PerkHelper.getPerkByType(tag, Perk.Type.AMMO); + Perk ammoPerk = PerkHelper.getPerkByType(data, Perk.Type.AMMO); if (ammoPerk != null && PerkHelper.getPerkItem(ammoPerk).isPresent()) { xOffset += 20; var ammoItem = PerkHelper.getPerkItem(ammoPerk).get().get(); ItemStack perkStack = ammoItem.getDefaultInstance(); - CompoundTag ammoTag = PerkHelper.getPerkTag(tag, Perk.Type.AMMO); + CompoundTag ammoTag = PerkHelper.getPerkTag(data, Perk.Type.AMMO); if (!ammoTag.isEmpty()) { - int level = PerkHelper.getItemPerkLevel(ammoPerk, tag); + int level = PerkHelper.getItemPerkLevel(ammoPerk, data); perkStack.setCount(level); } guiGraphics.renderItem(perkStack, x + xOffset, y + 2); guiGraphics.renderItemDecorations(font, perkStack, x + xOffset, y + 2); } - Perk funcPerk = PerkHelper.getPerkByType(tag, Perk.Type.FUNCTIONAL); + Perk funcPerk = PerkHelper.getPerkByType(data, Perk.Type.FUNCTIONAL); if (funcPerk != null && PerkHelper.getPerkItem(funcPerk).isPresent()) { xOffset += 20; var funcItem = PerkHelper.getPerkItem(funcPerk).get().get(); ItemStack perkStack = funcItem.getDefaultInstance(); - CompoundTag funcTag = PerkHelper.getPerkTag(tag, Perk.Type.FUNCTIONAL); + CompoundTag funcTag = PerkHelper.getPerkTag(data, Perk.Type.FUNCTIONAL); if (!funcTag.isEmpty()) { - int level = PerkHelper.getItemPerkLevel(funcPerk, tag); + int level = PerkHelper.getItemPerkLevel(funcPerk, data); perkStack.setCount(level); } @@ -251,16 +253,16 @@ public class ClientGunImageTooltip implements ClientTooltipComponent { guiGraphics.renderItemDecorations(font, perkStack, x + xOffset, y + 2); } - Perk damagePerk = PerkHelper.getPerkByType(tag, Perk.Type.DAMAGE); + Perk damagePerk = PerkHelper.getPerkByType(data, Perk.Type.DAMAGE); if (damagePerk != null && PerkHelper.getPerkItem(damagePerk).isPresent()) { xOffset += 20; var damageItem = PerkHelper.getPerkItem(damagePerk).get().get(); ItemStack perkStack = damageItem.getDefaultInstance(); - CompoundTag damageTag = PerkHelper.getPerkTag(tag, Perk.Type.DAMAGE); + CompoundTag damageTag = PerkHelper.getPerkTag(data, Perk.Type.DAMAGE); if (!damageTag.isEmpty()) { - int level = PerkHelper.getItemPerkLevel(damagePerk, tag); + int level = PerkHelper.getItemPerkLevel(damagePerk, data); perkStack.setCount(level); } @@ -281,13 +283,13 @@ public class ClientGunImageTooltip implements ClientTooltipComponent { int yOffset = -5; - Perk ammoPerk = PerkHelper.getPerkByType(tag, Perk.Type.AMMO); + Perk ammoPerk = PerkHelper.getPerkByType(data, Perk.Type.AMMO); if (ammoPerk != null && PerkHelper.getPerkItem(ammoPerk).isPresent()) { yOffset += 25; var ammoItem = PerkHelper.getPerkItem(ammoPerk).get().get(); guiGraphics.renderItem(ammoItem.getDefaultInstance(), x, y + 4 + yOffset); - CompoundTag ammoTag = PerkHelper.getPerkTag(tag, Perk.Type.AMMO); + CompoundTag ammoTag = PerkHelper.getPerkTag(data, Perk.Type.AMMO); if (!ammoTag.isEmpty()) { var ids = ammoTag.getString("id").split(":"); if (ids.length > 1) { @@ -303,13 +305,13 @@ public class ClientGunImageTooltip implements ClientTooltipComponent { } } - Perk funcPerk = PerkHelper.getPerkByType(tag, Perk.Type.FUNCTIONAL); + Perk funcPerk = PerkHelper.getPerkByType(data, Perk.Type.FUNCTIONAL); if (funcPerk != null && PerkHelper.getPerkItem(funcPerk).isPresent()) { yOffset += 25; var funcItem = PerkHelper.getPerkItem(funcPerk).get().get(); guiGraphics.renderItem(funcItem.getDefaultInstance(), x, y + 4 + yOffset); - CompoundTag funcTag = PerkHelper.getPerkTag(tag, Perk.Type.FUNCTIONAL); + CompoundTag funcTag = PerkHelper.getPerkTag(data, Perk.Type.FUNCTIONAL); if (!funcTag.isEmpty()) { var ids = funcTag.getString("id").split(":"); if (ids.length > 1) { @@ -325,13 +327,13 @@ public class ClientGunImageTooltip implements ClientTooltipComponent { } } - Perk damagePerk = PerkHelper.getPerkByType(tag, Perk.Type.DAMAGE); + Perk damagePerk = PerkHelper.getPerkByType(data, Perk.Type.DAMAGE); if (damagePerk != null && PerkHelper.getPerkItem(damagePerk).isPresent()) { yOffset += 25; var damageItem = PerkHelper.getPerkItem(damagePerk).get().get(); guiGraphics.renderItem(damageItem.getDefaultInstance(), x, y + 4 + yOffset); - CompoundTag damageTag = PerkHelper.getPerkTag(tag, Perk.Type.DAMAGE); + CompoundTag damageTag = PerkHelper.getPerkTag(data, Perk.Type.DAMAGE); if (!damageTag.isEmpty()) { var ids = damageTag.getString("id").split(":"); if (ids.length > 1) { @@ -368,7 +370,7 @@ public class ClientGunImageTooltip implements ClientTooltipComponent { int width = 0; - CompoundTag ammoTag = PerkHelper.getPerkTag(tag, Perk.Type.AMMO); + CompoundTag ammoTag = PerkHelper.getPerkTag(data, Perk.Type.AMMO); if (!ammoTag.isEmpty()) { var ids = ammoTag.getString("id").split(":"); if (ids.length > 1) { @@ -378,7 +380,7 @@ public class ClientGunImageTooltip implements ClientTooltipComponent { } } - CompoundTag funcTag = PerkHelper.getPerkTag(tag, Perk.Type.FUNCTIONAL); + CompoundTag funcTag = PerkHelper.getPerkTag(data, Perk.Type.FUNCTIONAL); if (!funcTag.isEmpty()) { var ids = funcTag.getString("id").split(":"); if (ids.length > 1) { @@ -388,7 +390,7 @@ public class ClientGunImageTooltip implements ClientTooltipComponent { } } - CompoundTag damageTag = PerkHelper.getPerkTag(tag, Perk.Type.DAMAGE); + CompoundTag damageTag = PerkHelper.getPerkTag(data, Perk.Type.DAMAGE); if (!damageTag.isEmpty()) { var ids = damageTag.getString("id").split(":"); if (ids.length > 1) { diff --git a/src/main/java/com/atsuishio/superbwarfare/client/tooltip/ClientLauncherImageTooltip.java b/src/main/java/com/atsuishio/superbwarfare/client/tooltip/ClientLauncherImageTooltip.java index 4e93ebc66..bb07c430a 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/tooltip/ClientLauncherImageTooltip.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/tooltip/ClientLauncherImageTooltip.java @@ -5,7 +5,6 @@ import com.atsuishio.superbwarfare.client.tooltip.component.GunImageComponent; import com.atsuishio.superbwarfare.init.ModPerks; import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.tools.FormatTool; -import com.atsuishio.superbwarfare.tools.GunsTool; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; @@ -17,11 +16,11 @@ public class ClientLauncherImageTooltip extends ClientGunImageTooltip { @Override protected Component getDamageComponent() { - double damage = GunsTool.getGunDoubleTag(tag, "Damage") * TooltipTool.perkDamage(stack); - int perkLevel = PerkHelper.getItemPerkLevel(ModPerks.MICRO_MISSILE.get(), tag); + double damage = data.damage() * TooltipTool.perkDamage(stack); + int perkLevel = PerkHelper.getItemPerkLevel(ModPerks.MICRO_MISSILE.get(), data); if (perkLevel > 0) damage *= 1.1f + perkLevel * 0.1f; - double explosionDamage = GunsTool.getGunDoubleTag(tag, "ExplosionDamage"); + double explosionDamage = data.explosionDamage(); return Component.translatable("des.superbwarfare.guns.damage").withStyle(ChatFormatting.GRAY) .append(Component.literal("").withStyle(ChatFormatting.RESET)) diff --git a/src/main/java/com/atsuishio/superbwarfare/client/tooltip/ClientSecondaryCataclysmImageTooltip.java b/src/main/java/com/atsuishio/superbwarfare/client/tooltip/ClientSecondaryCataclysmImageTooltip.java index 58952b63e..d7963ce16 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/tooltip/ClientSecondaryCataclysmImageTooltip.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/tooltip/ClientSecondaryCataclysmImageTooltip.java @@ -5,7 +5,6 @@ import com.atsuishio.superbwarfare.client.tooltip.component.GunImageComponent; import com.atsuishio.superbwarfare.init.ModPerks; import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.tools.FormatTool; -import com.atsuishio.superbwarfare.tools.GunsTool; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; @@ -17,11 +16,11 @@ public class ClientSecondaryCataclysmImageTooltip extends ClientEnergyImageToolt @Override protected Component getDamageComponent() { - double damage = GunsTool.getGunDoubleTag(tag, "Damage") * TooltipTool.perkDamage(stack); - int perkLevel = PerkHelper.getItemPerkLevel(ModPerks.MICRO_MISSILE.get(), tag); + double damage = data.damage() * TooltipTool.perkDamage(stack); + int perkLevel = PerkHelper.getItemPerkLevel(ModPerks.MICRO_MISSILE.get(), data); if (perkLevel > 0) damage *= 1.1f + perkLevel * 0.1f; - double explosionDamage = GunsTool.getGunDoubleTag(tag, "ExplosionDamage"); + double explosionDamage = data.explosionDamage(); return Component.translatable("des.superbwarfare.guns.damage").withStyle(ChatFormatting.GRAY) .append(Component.literal("").withStyle(ChatFormatting.RESET)) diff --git a/src/main/java/com/atsuishio/superbwarfare/client/tooltip/ClientSentinelImageTooltip.java b/src/main/java/com/atsuishio/superbwarfare/client/tooltip/ClientSentinelImageTooltip.java index fbdb9128a..eb32f29df 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/tooltip/ClientSentinelImageTooltip.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/tooltip/ClientSentinelImageTooltip.java @@ -19,8 +19,7 @@ public class ClientSentinelImageTooltip extends ClientEnergyImageTooltip { var cap = stack.getCapability(Capabilities.EnergyStorage.ITEM); if (cap != null && cap.getEnergyStored() > 0) { - double damage = (GunsTool.getGunDoubleTag(tag, "Damage") + - GunsTool.getGunDoubleTag(tag, "ChargedDamage")) + double damage = (data.damage() + GunsTool.getGunDoubleTag(data.getTag(), "ChargedDamage")) * TooltipTool.perkDamage(stack); return Component.translatable("des.superbwarfare.guns.damage").withStyle(ChatFormatting.GRAY) .append(Component.literal("").withStyle(ChatFormatting.RESET)) @@ -28,7 +27,7 @@ public class ClientSentinelImageTooltip extends ClientEnergyImageTooltip { FormatTool.format1D(0.8 * damage * (1 + 0.1 * TooltipTool.heBulletLevel(stack))) : "")) .withStyle(ChatFormatting.AQUA).withStyle(ChatFormatting.BOLD)); } else { - double damage = GunsTool.getGunDoubleTag(tag, "Damage") * TooltipTool.perkDamage(stack); + double damage = data.damage() * TooltipTool.perkDamage(stack); return Component.translatable("des.superbwarfare.guns.damage").withStyle(ChatFormatting.GRAY) .append(Component.literal("").withStyle(ChatFormatting.RESET)) .append(Component.literal(FormatTool.format1D(damage) + (TooltipTool.heBullet(stack) ? diff --git a/src/main/java/com/atsuishio/superbwarfare/client/tooltip/ClientShotgunImageTooltip.java b/src/main/java/com/atsuishio/superbwarfare/client/tooltip/ClientShotgunImageTooltip.java index bbfd0f412..ab86bfe4d 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/tooltip/ClientShotgunImageTooltip.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/tooltip/ClientShotgunImageTooltip.java @@ -6,7 +6,6 @@ import com.atsuishio.superbwarfare.perk.AmmoPerk; import com.atsuishio.superbwarfare.perk.Perk; import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.tools.FormatTool; -import com.atsuishio.superbwarfare.tools.GunsTool; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; @@ -20,22 +19,22 @@ public class ClientShotgunImageTooltip extends ClientGunImageTooltip { protected Component getDamageComponent() { boolean slug = false; - var perk = PerkHelper.getPerkByType(tag, Perk.Type.AMMO); + var perk = PerkHelper.getPerkByType(data, Perk.Type.AMMO); if (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug) { slug = true; } if (slug) { - double damage = GunsTool.getGunDoubleTag(tag, "Damage") * GunsTool.getGunIntTag(tag, "ProjectileAmount") * TooltipTool.perkDamage(stack); + double damage = data.damage() * data.projectileAmount() * TooltipTool.perkDamage(stack); return Component.translatable("des.superbwarfare.guns.damage").withStyle(ChatFormatting.GRAY) .append(Component.literal("").withStyle(ChatFormatting.RESET)) .append(Component.literal(FormatTool.format1D(damage) + (TooltipTool.heBullet(stack) ? " + " + FormatTool.format1D(0.8 * damage * (1 + 0.1 * TooltipTool.heBulletLevel(stack))) : "")).withStyle(ChatFormatting.GREEN)); } else { - double damage = GunsTool.getGunDoubleTag(tag, "Damage") * TooltipTool.perkDamage(stack); + double damage = data.damage() * TooltipTool.perkDamage(stack); return Component.translatable("des.superbwarfare.guns.damage").withStyle(ChatFormatting.GRAY) .append(Component.literal("").withStyle(ChatFormatting.RESET)) - .append(Component.literal(FormatTool.format1D(damage) + " * " + FormatTool.format0D(GunsTool.getGunIntTag(tag, "ProjectileAmount"))).withStyle(ChatFormatting.GREEN)); + .append(Component.literal(FormatTool.format1D(damage) + " * " + FormatTool.format0D(data.projectileAmount())).withStyle(ChatFormatting.GREEN)); } } } diff --git a/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java b/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java index 4272fe540..1212e68ec 100644 --- a/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java @@ -10,6 +10,7 @@ import com.atsuishio.superbwarfare.entity.vehicle.base.MobileVehicleEntity; import com.atsuishio.superbwarfare.entity.vehicle.base.VehicleEntity; import com.atsuishio.superbwarfare.entity.vehicle.base.WeaponVehicleEntity; import com.atsuishio.superbwarfare.init.*; +import com.atsuishio.superbwarfare.item.gun.GunData; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.network.message.send.*; import com.atsuishio.superbwarfare.perk.AmmoPerk; @@ -125,7 +126,7 @@ public class ClientEventHandler { public static boolean holdFireVehicle = false; public static boolean zoomVehicle = false; - public static int burstFireSize = 0; + public static int burstFireAmount = 0; public static int customRpm = 0; @@ -219,9 +220,10 @@ public class ClientEventHandler { final var tag = NBTTool.getTag(stack); if (stack.is(ModItems.MINIGUN.get())) { + var data = GunData.from(stack); if (holdFire || zoom) { miniGunRot = Math.min(miniGunRot + 5, 21); - float rpm = (float) GunsTool.getGunIntTag(tag, "RPM") / 3600; + float rpm = (float) data.rpm() / 3600; player.playSound(ModSounds.MINIGUN_ROT.get(), 1, 0.7f + rpm); } } @@ -301,6 +303,7 @@ public class ClientEventHandler { public static void handleGunMelee(Player player, ItemStack stack, final CompoundTag tag) { if (stack.getItem() instanceof GunItem gunItem) { + var data = GunData.from(stack); var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE); if (gunItem.hasMeleeAttack(stack) && gunMelee == 0 && drawTime < 0.01 && ModKeyMappings.MELEE.isDown() @@ -308,8 +311,8 @@ public class ClientEventHandler { && !holdFireVehicle && !notInGame() && cap != null && !cap.edit - && !(tag.getBoolean("is_normal_reloading") || tag.getBoolean("is_empty_reloading")) - && !GunsTool.getGunBooleanTag(tag, "Reloading") + && !(data.normalReloading() || data.emptyReloading()) + && !data.isReloading() && !player.getCooldowns().isOnCooldown(stack.getItem()) && !GunsTool.getGunBooleanTag(tag, "Charging")) { gunMelee = 36; @@ -390,16 +393,16 @@ public class ClientEventHandler { gunSpread = 0; return; } - - final var tag = NBTTool.getTag(stack); + var data = GunData.from(stack); + final var tag = data.getTag(); var perk = PerkHelper.getPerkByType(tag, Perk.Type.AMMO); - int mode = GunsTool.getGunIntTag(tag, "FireMode"); + int mode = data.getFireMode(); // 精准度 float times = (float) Math.min(Minecraft.getInstance().getTimer().getRealtimeDeltaTicks(), 0.8); - double basicDev = GunsTool.getGunDoubleTag(tag, "Spread"); + double basicDev = data.spread(); double walk = isMoving() ? 0.3 * basicDev : 0; double sprint = player.isSprinting() ? 0.25 * basicDev : 0; double crouching = player.isCrouching() ? -0.15 * basicDev : 0; @@ -428,7 +431,7 @@ public class ClientEventHandler { gunSpread = Mth.lerp(0.14 * times, gunSpread, spread); // 开火部分 - double weight = GunsTool.getGunDoubleTag(tag, "Weight") + GunsTool.getGunDoubleTag(tag, "CustomWeight"); + double weight = data.weight(); double speed = 1 - (0.04 * weight); if (player.getPersistentData().getDouble("noRun") == 0 && player.isSprinting() && !zoom) { @@ -437,7 +440,7 @@ public class ClientEventHandler { cantFireTime = Mth.clamp(cantFireTime - 6 * speed * times, 0, 40); } - int rpm = GunsTool.getGunIntTag(tag, "RPM") + customRpm; + int rpm = data.rpm() + customRpm; if (rpm == 0) { rpm = 600; } @@ -463,7 +466,7 @@ public class ClientEventHandler { var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE); - if ((holdFire || burstFireSize > 0) + if ((holdFire || burstFireAmount > 0) && !(player.getVehicle() instanceof ArmedVehicleEntity iArmedVehicle && iArmedVehicle.banHand(player)) && !holdFireVehicle && (stack.is(ModTags.Items.NORMAL_GUN) @@ -471,10 +474,10 @@ public class ClientEventHandler { && drawTime < 0.01 && cap != null && !cap.edit && !notInGame() - && (!(tag.getBoolean("is_normal_reloading") || tag.getBoolean("is_empty_reloading")) - && !GunsTool.getGunBooleanTag(tag, "Reloading") + && (!(data.normalReloading() || data.emptyReloading()) + && !data.isReloading() && !GunsTool.getGunBooleanTag(tag, "Charging") - && GunsTool.getGunIntTag(tag, "Ammo") > 0 + && data.getAmmo() > 0 && !player.getCooldowns().isOnCooldown(stack.getItem()) && !GunsTool.getGunBooleanTag(tag, "NeedBoltAction") && revolverPre(tag)) @@ -519,7 +522,7 @@ public class ClientEventHandler { clientTimer.stop(); } - if (stack.getItem() == ModItems.DEVOTION.get() && (tag.getBoolean("is_normal_reloading") || tag.getBoolean("is_empty_reloading"))) { + if (stack.getItem() == ModItems.DEVOTION.get() && (data.normalReloading() || data.emptyReloading())) { customRpm = 0; } } @@ -547,24 +550,25 @@ public class ClientEventHandler { public static void shootClient(Player player, final CompoundTag tag) { ItemStack stack = player.getMainHandItem(); + var data = GunData.from(stack); if (stack.is(ModTags.Items.NORMAL_GUN)) { - if (GunsTool.getGunIntTag(tag, "Ammo") > 0) { - int mode = GunsTool.getGunIntTag(tag, "FireMode"); + if (data.getAmmo() > 0) { + int mode = data.getFireMode(); if (mode != 2) { holdFire = false; } if (mode == 1) { - if (GunsTool.getGunIntTag(tag, "Ammo") == 1) { - burstFireSize = 1; + if (data.getAmmo() == 1) { + burstFireAmount = 1; } - if (burstFireSize == 1) { + if (burstFireAmount == 1) { cantFireTime = 30; } } - if (burstFireSize > 0) { - burstFireSize--; + if (burstFireAmount > 0) { + burstFireAmount--; } if (stack.is(ModItems.DEVOTION.get())) { @@ -581,7 +585,7 @@ public class ClientEventHandler { } // 判断是否为栓动武器(BoltActionTime > 0),并在开火后给一个需要上膛的状态 - if (GunsTool.getGunIntTag(tag, "BoltActionTime") > 0 && GunsTool.getGunIntTag(tag, "Ammo") > (stack.is(ModTags.Items.REVOLVER) ? 0 : 1)) { + if (data.boltActionTime() > 0 && data.getAmmo() > (stack.is(ModTags.Items.REVOLVER) ? 0 : 1)) { GunsTool.setGunBooleanTag(tag, "NeedBoltAction", true); } @@ -623,11 +627,12 @@ public class ClientEventHandler { if (player == null) return; ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return; + var data = GunData.from(stack); PacketDistributor.sendToServer(new ShootMessage(gunSpread)); fireRecoilTime = 10; - float gunRecoilY = (float) GunsTool.getGunDoubleTag(tag, "RecoilY") * 10; + var gunRecoilY = data.recoilY() * 10; recoilY = (float) (2 * Math.random() - 1) * gunRecoilY; @@ -840,7 +845,8 @@ public class ClientEventHandler { default -> 0.8; }; - double customWeight = GunsTool.getGunDoubleTag(tag, "CustomWeight"); + var data = GunData.from(stack); + double customWeight = data.customWeight(); var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE, null); @@ -1058,10 +1064,12 @@ public class ClientEventHandler { private static void handleWeaponZoom(LivingEntity entity) { if (!(entity instanceof Player player)) return; - final var tag = NBTTool.getTag(player.getMainHandItem()); + var stack = player.getMainHandItem(); + var data = GunData.from(stack); + final var tag = data.getTag(); float times = 5 * Minecraft.getInstance().getTimer().getRealtimeDeltaTicks(); - double weight = GunsTool.getGunDoubleTag(tag, "Weight") + GunsTool.getGunDoubleTag(tag, "CustomWeight"); + double weight = data.weight(); double speed = 1.5 - (0.07 * weight); var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE); @@ -1091,7 +1099,8 @@ public class ClientEventHandler { float roll = event.getRoll(); ItemStack stack = entity.getMainHandItem(); - double amplitude = 15000 * GunsTool.getGunDoubleTag(tag, "RecoilY") * GunsTool.getGunDoubleTag(tag, "RecoilX"); + var data = GunData.from(stack); + double amplitude = 15000 * data.recoilY() * data.recoilX(); if (fireRecoilTime > 0) { firePosTimer = 0.001; @@ -1126,7 +1135,7 @@ public class ClientEventHandler { double rpm = 1; if (stack.is(ModItems.MINIGUN.get())) { - rpm = (double) GunsTool.getGunIntTag(tag, "RPM") / 1800; + rpm = (double) data.rpm() / 1800; } float[] shake = {0, 0}; @@ -1210,15 +1219,16 @@ public class ClientEventHandler { gripRecoilY = 1.25; } - double customWeight = GunsTool.getGunDoubleTag(tag, "CustomWeight"); + var data = GunData.from(stack); + double customWeight = data.customWeight(); double rpm = 1; if (stack.is(ModItems.MINIGUN.get())) { - rpm = (double) GunsTool.getGunIntTag(tag, "RPM") / 1800; + rpm = (double) data.rpm() / 1800; } - float gunRecoilX = (float) GunsTool.getGunDoubleTag(tag, "RecoilX") * 60; + float gunRecoilX = (float) data.recoilX() * 60; recoilHorizon = Mth.lerp(0.2 * times, recoilHorizon, 0) + recoilY; recoilY = 0; @@ -1512,13 +1522,14 @@ public class ClientEventHandler { lungeDraw = 30; lungeSprint = 0; lungeAttack = 0; - burstFireSize = 0; + burstFireAmount = 0; } private static void handleWeaponDraw(LivingEntity entity, final CompoundTag tag) { float times = Minecraft.getInstance().getTimer().getRealtimeDeltaTicks(); - - double weight = GunsTool.getGunDoubleTag(tag, "Weight") + GunsTool.getGunDoubleTag(tag, "CustomWeight"); + ItemStack stack = entity.getMainHandItem(); + var data = GunData.from(stack); + double weight = data.weight(); double speed = 3.2 - (0.13 * weight); drawTime = Math.max(drawTime - Math.max(0.2 * speed * times * drawTime, 0.0008), 0); } diff --git a/src/main/java/com/atsuishio/superbwarfare/event/GunEventHandler.java b/src/main/java/com/atsuishio/superbwarfare/event/GunEventHandler.java index 43298c221..d0875b3d5 100644 --- a/src/main/java/com/atsuishio/superbwarfare/event/GunEventHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/event/GunEventHandler.java @@ -9,11 +9,15 @@ 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.perk.AmmoPerk; import com.atsuishio.superbwarfare.perk.Perk; import com.atsuishio.superbwarfare.perk.PerkHelper; -import com.atsuishio.superbwarfare.tools.*; +import com.atsuishio.superbwarfare.tools.AmmoType; +import com.atsuishio.superbwarfare.tools.GunsTool; +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; @@ -41,25 +45,27 @@ public class GunEventHandler { Player player = event.getEntity(); ItemStack stack = player.getMainHandItem(); - var tag = NBTTool.getTag(stack); if (stack.is(ModTags.Items.GUN)) { - handleGunBolt(player, tag); - handleGunReload(player, tag); - handleGunSingleReload(player, tag); - handleSentinelCharge(player, tag); + var data = GunData.from(stack); + handleGunBolt(player, data.reload()); + handleGunReload(player, data.reload()); + handleGunSingleReload(player, data.reload()); + handleSentinelCharge(player, data.reload()); + data.save(); } - - NBTTool.saveTag(stack, tag); } /** * 拉大栓 */ - private static void handleGunBolt(Player player, final CompoundTag tag) { + private static void handleGunBolt(Player player, GunData gunData) { ItemStack stack = player.getMainHandItem(); + if (stack.is(ModTags.Items.NORMAL_GUN)) { + var tag = gunData.getTag(); var data = tag.getCompound("GunData"); + if (GunsTool.getGunIntTag(tag, "BoltActionTick") > 0) { data.putInt("BoltActionTick", GunsTool.getGunIntTag(tag, "BoltActionTick") - 1); } @@ -75,6 +81,7 @@ public class GunEventHandler { } } } + gunData.save(); } /** @@ -83,7 +90,8 @@ public class GunEventHandler { public static void playGunSounds(Player player) { ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return; - final var tag = NBTTool.getTag(stack); + var data = GunData.from(stack); + var tag = data.getTag(); if (!player.level().isClientSide) { String origin = stack.getItem().getDescriptionId(); @@ -93,7 +101,7 @@ public class GunEventHandler { var cap = stack.getCapability(Capabilities.EnergyStorage.ITEM); if (cap != null && cap.getEnergyStored() > 0) { - float soundRadius = (float) GunsTool.getGunDoubleTag(tag, "SoundRadius"); + float soundRadius = (float) data.soundRadius(); SoundEvent sound3p = BuiltInRegistries.SOUND_EVENT.get(Mod.loc("sentinel_charge_fire_3p")); if (sound3p != null) { @@ -118,7 +126,7 @@ public class GunEventHandler { player.playSound(ModSounds.HENG.get(), 4f, 1f); } - float soundRadius = (float) (GunsTool.getGunDoubleTag(tag, "SoundRadius") * GunsTool.getGunDoubleTag(tag, "CustomSoundRadius")); + float soundRadius = (float) data.soundRadius(); int barrelType = GunsTool.getAttachmentType(tag, GunsTool.AttachmentType.BARREL); SoundEvent sound3p = BuiltInRegistries.SOUND_EVENT.get(Mod.loc(name + (barrelType == 2 ? "_fire_3p_s" : "_fire_3p"))); @@ -141,7 +149,7 @@ public class GunEventHandler { public static void playGunBoltSounds(Player player) { ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return; - final var tag = NBTTool.getTag(stack); + var data = GunData.from(stack); if (!player.level().isClientSide) { String origin = stack.getItem().getDescriptionId(); @@ -156,7 +164,7 @@ public class GunEventHandler { if (stack.is(ModTags.Items.REVOLVER)) return; - Mod.queueServerWork((int) (GunsTool.getGunDoubleTag(tag, "BoltActionTime") / 2 + 1.5 * shooterHeight), () -> { + Mod.queueServerWork((int) (data.boltActionTime() / 2 + 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)) { @@ -171,18 +179,17 @@ public class GunEventHandler { public static void gunShoot(Player player, final CompoundTag tag, double spared) { ItemStack stack = player.getMainHandItem(); + var data = GunData.from(stack); if (!player.level().isClientSide()) { - float headshot = (float) GunsTool.getGunDoubleTag(tag, "Headshot"); - float damage = (float) (GunsTool.getGunDoubleTag(tag, "Damage") + + float headshot = (float) data.headshot(); + float damage = (float) (data.damage() + GunsTool.getGunDoubleTag(tag, "ChargedDamage")) * (float) perkDamage(tag); - float velocity = (float) ((GunsTool.getGunDoubleTag(tag, "Velocity") + GunsTool.getGunDoubleTag(tag, "CustomVelocity")) * perkSpeed(tag)); - int projectileAmount = GunsTool.getGunIntTag(tag, "ProjectileAmount"); - float bypassArmorRate = (float) GunsTool.getGunDoubleTag(tag, "BypassesArmor"); - + float velocity = (float) ((data.velocity() + GunsTool.getGunDoubleTag(tag, "CustomVelocity")) * perkSpeed(tag)); + int projectileAmount = data.projectileAmount(); + float bypassArmorRate = (float) data.bypassArmor(); var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE); boolean zoom = cap != null && cap.zoom; - var perk = PerkHelper.getPerkByType(tag, Perk.Type.AMMO); if (perk != null && perk.descriptionId.equals("butterfly_bullet")) { @@ -309,28 +316,30 @@ public class GunEventHandler { /** * 通用的武器换弹流程 */ - private static void handleGunReload(Player player, final CompoundTag tag) { + private static void handleGunReload(Player player, GunData gunData) { ItemStack stack = player.getMainHandItem(); if (!(stack.getItem() instanceof GunItem gunItem)) return; - final CompoundTag data = tag.getCompound("GunData"); + var tag = gunData.getTag(); + var data = gunData.getData(); + // 启动换弹 if (GunsTool.getGunBooleanTag(tag, "StartReload")) { NeoForge.EVENT_BUS.post(new ReloadEvent.Pre(player, stack)); if (gunItem.isOpenBolt(stack)) { - if (GunsTool.getGunIntTag(tag, "Ammo") == 0) { - data.putInt("ReloadTime", data.getInt("EmptyReloadTime") + 1); - tag.putBoolean("is_empty_reloading", true); + if (gunData.getAmmo() == 0) { + data.putInt("ReloadTime", gunData.emptyReloadTime() + 1); + gunData.setReloadState(GunData.ReloadState.EMPTY_RELOADING); playGunEmptyReloadSounds(player); } else { - data.putInt("ReloadTime", data.getInt("NormalReloadTime") + 1); - tag.putBoolean("is_normal_reloading", true); + data.putInt("ReloadTime", gunData.normalReloadTime() + 1); + gunData.setReloadState(GunData.ReloadState.NORMAL_RELOADING); playGunNormalReloadSounds(player); } } else { - data.putInt("ReloadTime", data.getInt("EmptyReloadTime") + 2); - tag.putBoolean("is_empty_reloading", true); + data.putInt("ReloadTime", gunData.emptyReloadTime() + 2); + gunData.setReloadState(GunData.ReloadState.EMPTY_RELOADING); playGunEmptyReloadSounds(player); } data.putBoolean("StartReload", false); @@ -349,119 +358,105 @@ public class GunEventHandler { } } - if (stack.getItem() == ModItems.MK_14.get()) { - if (data.getInt("ReloadTime") == 18) { - data.putBoolean("HoldOpen", false); - } + if (stack.getItem() == ModItems.MK_14.get() && data.getInt("ReloadTime") == 18) { + data.putBoolean("HoldOpen", false); } - if (stack.getItem() == ModItems.SVD.get()) { - if (data.getInt("ReloadTime") == 17) { - data.putBoolean("HoldOpen", false); - } + if (stack.getItem() == ModItems.SVD.get() && data.getInt("ReloadTime") == 17) { + data.putBoolean("HoldOpen", false); } - if (stack.getItem() == ModItems.SKS.get()) { - if (data.getInt("ReloadTime") == 14) { - data.putBoolean("HoldOpen", false); - } + if (stack.getItem() == ModItems.SKS.get() && data.getInt("ReloadTime") == 14) { + data.putBoolean("HoldOpen", false); } - if (stack.getItem() == ModItems.M_60.get()) { - if (data.getInt("ReloadTime") == 55) { - data.putBoolean("HideBulletChain", false); - } + if (stack.getItem() == ModItems.M_60.get() && data.getInt("ReloadTime") == 55) { + data.putBoolean("HideBulletChain", false); } - 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 (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 (data.getInt("ReloadTime") == 9) { data.putBoolean("HoldOpen", false); } } - if (stack.getItem() == ModItems.QBZ_95.get()) { - if (data.getInt("ReloadTime") == 14) { - data.putBoolean("HoldOpen", false); - } + if (stack.getItem() == ModItems.QBZ_95.get() && data.getInt("ReloadTime") == 14) { + data.putBoolean("HoldOpen", false); } if (data.getInt("ReloadTime") == 1) { if (gunItem.isOpenBolt(stack)) { - if (GunsTool.getGunIntTag(tag, "Ammo") == 0) { - playGunEmptyReload(player, tag); + if (gunData.getAmmo() == 0) { + playGunEmptyReload(player, gunData); } else { - playGunNormalReload(player, tag); + playGunNormalReload(player, gunData); } } else { - playGunEmptyReload(player, tag); + playGunEmptyReload(player, gunData); } data.putBoolean("StartReload", false); } - - tag.put("GunData", data); + gunData.save(); } - public static void playGunNormalReload(Player player, final CompoundTag tag) { - ItemStack stack = player.getMainHandItem(); - if (!(stack.getItem() instanceof GunItem gunItem)) return; + public static void playGunNormalReload(Player player, GunData gunData) { + var stack = gunData.getStack(); + var gunItem = gunData.getItem(); if (player.getInventory().hasAnyMatching(item -> item.is(ModItems.CREATIVE_AMMO_BOX.get()))) { - var data = tag.getCompound("GunData"); - data.putInt("Ammo", data.getInt("Magazine") + data.getInt("CustomMagazine") + (gunItem.hasBulletInBarrel(stack) ? 1 : 0)); + gunData.setAmmo(gunData.magazine() + (gunItem.hasBulletInBarrel(stack) ? 1 : 0)); } else { if (stack.is(ModTags.Items.USE_SHOTGUN_AMMO)) { - GunsTool.reload(player, stack, tag, AmmoType.SHOTGUN, gunItem.hasBulletInBarrel(stack)); + GunsTool.reload(player, stack, gunData.reload(), AmmoType.SHOTGUN, gunItem.hasBulletInBarrel(stack)); } else if (stack.is(ModTags.Items.USE_SNIPER_AMMO)) { - GunsTool.reload(player, stack, tag, AmmoType.SNIPER, true); + GunsTool.reload(player, stack, gunData.reload(), AmmoType.SNIPER, true); } else if (stack.is(ModTags.Items.USE_HANDGUN_AMMO)) { - GunsTool.reload(player, stack, tag, AmmoType.HANDGUN, true); + GunsTool.reload(player, stack, gunData.reload(), AmmoType.HANDGUN, true); } else if (stack.is(ModTags.Items.USE_RIFLE_AMMO)) { - GunsTool.reload(player, stack, tag, AmmoType.RIFLE, gunItem.hasBulletInBarrel(stack)); + GunsTool.reload(player, stack, gunData.reload(), AmmoType.RIFLE, gunItem.hasBulletInBarrel(stack)); } else if (stack.is(ModTags.Items.USE_HEAVY_AMMO)) { - GunsTool.reload(player, stack, tag, AmmoType.HEAVY, gunItem.hasBulletInBarrel(stack)); + GunsTool.reload(player, stack, gunData.reload(), AmmoType.HEAVY, gunItem.hasBulletInBarrel(stack)); } } - tag.putBoolean("is_normal_reloading", false); - tag.putBoolean("is_empty_reloading", false); - + gunData.setReloadState(GunData.ReloadState.NOT_RELOADING); NeoForge.EVENT_BUS.post(new ReloadEvent.Post(player, stack)); } - public static void playGunEmptyReload(Player player, final CompoundTag tag) { - ItemStack stack = player.getMainHandItem(); - var data = tag.getCompound("GunData"); + public static void playGunEmptyReload(Player player, GunData gunData) { + ItemStack stack = gunData.getStack(); if (player.getInventory().hasAnyMatching(item -> item.is(ModItems.CREATIVE_AMMO_BOX.get()))) { - data.putInt("Ammo", data.getInt("Magazine") + data.getInt("CustomMagazine")); + gunData.setAmmo(gunData.magazine()); } else { if (stack.is(ModTags.Items.USE_SHOTGUN_AMMO)) { - GunsTool.reload(player, stack, tag, AmmoType.SHOTGUN); + GunsTool.reload(player, stack, gunData.reload(), AmmoType.SHOTGUN); } else if (stack.is(ModTags.Items.USE_SNIPER_AMMO)) { - GunsTool.reload(player, stack, tag, AmmoType.SNIPER); + GunsTool.reload(player, stack, gunData.reload(), AmmoType.SNIPER); } else if (stack.is(ModTags.Items.USE_HANDGUN_AMMO)) { - GunsTool.reload(player, stack, tag, AmmoType.HANDGUN); + GunsTool.reload(player, stack, gunData.reload(), AmmoType.HANDGUN); } else if (stack.is(ModTags.Items.USE_RIFLE_AMMO)) { - GunsTool.reload(player, stack, tag, AmmoType.RIFLE); + GunsTool.reload(player, stack, gunData.reload(), AmmoType.RIFLE); } else if (stack.is(ModTags.Items.USE_HEAVY_AMMO)) { - GunsTool.reload(player, stack, tag, AmmoType.HEAVY); + GunsTool.reload(player, stack, gunData.reload(), AmmoType.HEAVY); } else if (stack.getItem() == ModItems.TASER.get()) { - data.putInt("Ammo", 1); + 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()) { - data.putInt("Ammo", 1); + gunData.setAmmo(1); player.getInventory().clearOrCountMatchingItems(p -> p.getItem() == ModItems.GRENADE_40MM.get(), 1, player.inventoryMenu.getCraftSlots()); } else if (stack.getItem() == ModItems.RPG.get()) { - data.putInt("Ammo", 1); + gunData.setAmmo(1); player.getInventory().clearOrCountMatchingItems(p -> p.getItem() == ModItems.ROCKET.get(), 1, player.inventoryMenu.getCraftSlots()); } else if (stack.getItem() == ModItems.JAVELIN.get()) { - data.putInt("Ammo", 1); + gunData.setAmmo(1); player.getInventory().clearOrCountMatchingItems(p -> p.getItem() == ModItems.JAVELIN_MISSILE.get(), 1, player.inventoryMenu.getCraftSlots()); } } - - tag.putBoolean("is_normal_reloading", false); - tag.putBoolean("is_empty_reloading", false); - + gunData.setReloadState(GunData.ReloadState.NOT_RELOADING); NeoForge.EVENT_BUS.post(new ReloadEvent.Post(player, stack)); } @@ -504,9 +499,10 @@ public class GunEventHandler { /** * 单发装填类的武器换弹流程 */ - private static void handleGunSingleReload(Player player, final CompoundTag tag) { + private static void handleGunSingleReload(Player player, GunData gunData) { ItemStack stack = player.getMainHandItem(); if (!(stack.getItem() instanceof GunItem)) return; + var tag = gunData.getTag(); // 换弹流程计时器 if (tag.getDouble("prepare") > 0) { @@ -533,41 +529,38 @@ public class GunEventHandler { if (tag.getBoolean("start_single_reload")) { NeoForge.EVENT_BUS.post(new ReloadEvent.Pre(player, stack)); - if ((GunsTool.getGunIntTag(tag, "PrepareLoadTime") != 0 - && GunsTool.getGunIntTag(tag, "Ammo") == 0) - || stack.is(ModItems.SECONDARY_CATACLYSM.get()) - ) { + if ((gunData.prepareLoadTime() != 0 && gunData.getAmmo() == 0) || stack.is(ModItems.SECONDARY_CATACLYSM.get())) { // 此处判断空仓换弹的时候,是否在准备阶段就需要装填一发,如M870 playGunPrepareLoadReloadSounds(player); - int prepareLoadTime = GunsTool.getGunIntTag(tag, "PrepareLoadTime"); + int prepareLoadTime = gunData.prepareLoadTime(); tag.putInt("prepare_load", prepareLoadTime + 1); player.getCooldowns().addCooldown(stack.getItem(), prepareLoadTime); - } else if (GunsTool.getGunIntTag(tag, "PrepareEmptyTime") != 0 && GunsTool.getGunIntTag(tag, "Ammo") == 0) { + } else if (gunData.prepareEmptyTime() != 0 && gunData.getAmmo() == 0) { // 此处判断空仓换弹,如莫辛纳甘 playGunEmptyPrepareSounds(player); - int prepareEmptyTime = GunsTool.getGunIntTag(tag, "PrepareEmptyTime"); + int prepareEmptyTime = gunData.prepareEmptyTime(); tag.putInt("prepare", prepareEmptyTime + 1); player.getCooldowns().addCooldown(stack.getItem(), prepareEmptyTime); } else { playGunPrepareReloadSounds(player); - int prepareTime = GunsTool.getGunIntTag(tag, "PrepareTime"); + int prepareTime = gunData.prepareTime(); tag.putInt("prepare", prepareTime + 1); player.getCooldowns().addCooldown(stack.getItem(), prepareTime); } tag.putBoolean("force_stop", false); tag.putBoolean("stop", false); - tag.putInt("reload_stage", 1); - GunsTool.setGunBooleanTag(tag, "Reloading", true); + gunData.setReloadStage(1); + gunData.setReloadState(GunData.ReloadState.NORMAL_RELOADING); tag.putBoolean("start_single_reload", false); } if (stack.getItem() == ModItems.M_870.get() && tag.getInt("prepare_load") == 10) { - singleLoad(player, tag); + singleLoad(player, gunData); } if (stack.getItem() == ModItems.SECONDARY_CATACLYSM.get() && tag.getInt("prepare_load") == 3) { - singleLoad(player, tag); + singleLoad(player, gunData); } // 一阶段结束,检查备弹,如果有则二阶段启动,无则直接跳到三阶段 @@ -588,13 +581,13 @@ public class GunEventHandler { tag.putBoolean("force_stage3_start", true); } else if (stack.is(ModTags.Items.LAUNCHER) && GunsTool.getGunIntTag(tag, "MaxAmmo") == 0) { tag.putBoolean("force_stage3_start", true); - } else if (stack.is(ModItems.SECONDARY_CATACLYSM.get()) && GunsTool.getGunIntTag(tag, "Ammo") >= GunsTool.getGunIntTag(tag, "Magazine")) { + } else if (stack.is(ModItems.SECONDARY_CATACLYSM.get()) && gunData.getAmmo() >= gunData.magazine()) { tag.putBoolean("force_stage3_start", true); } else { tag.putInt("reload_stage", 2); } } else { - if (stack.is(ModItems.SECONDARY_CATACLYSM.get()) && GunsTool.getGunIntTag(tag, "Ammo") >= GunsTool.getGunIntTag(tag, "Magazine")) { + if (stack.is(ModItems.SECONDARY_CATACLYSM.get()) && gunData.getAmmo() >= gunData.magazine()) { tag.putBoolean("force_stage3_start", true); } else { tag.putInt("reload_stage", 2); @@ -613,11 +606,11 @@ public class GunEventHandler { && tag.getInt("reload_stage") == 2 && tag.getInt("iterative") == 0 && !tag.getBoolean("stop") - && GunsTool.getGunIntTag(tag, "Ammo") < GunsTool.getGunIntTag(tag, "Magazine") - + GunsTool.getGunIntTag(tag, "CustomMagazine")) { + && gunData.getAmmo() < gunData.magazine() + ) { playGunLoopReloadSounds(player); - int iterativeTime = GunsTool.getGunIntTag(tag, "IterativeTime"); + int iterativeTime = gunData.iterativeTime(); tag.putDouble("iterative", iterativeTime); player.getCooldowns().addCooldown(stack.getItem(), iterativeTime); // 动画播放nbt @@ -633,25 +626,24 @@ public class GunEventHandler { || stack.getItem() == ModItems.MARLIN.get()) && tag.getInt("iterative") == 3 ) { - singleLoad(player, tag); + singleLoad(player, gunData); } if (stack.getItem() == ModItems.SECONDARY_CATACLYSM.get() && tag.getInt("iterative") == 16) { - singleLoad(player, tag); + singleLoad(player, gunData); } if ((stack.getItem() == ModItems.K_98.get() || stack.getItem() == ModItems.MOSIN_NAGANT.get()) && tag.getInt("iterative") == 1 ) { - singleLoad(player, tag); + singleLoad(player, gunData); } // 二阶段结束 if (tag.getInt("iterative") == 1) { // 装满结束 - if (GunsTool.getGunIntTag(tag, "Ammo") >= GunsTool.getGunIntTag(tag, "Magazine") - + GunsTool.getGunIntTag(tag, "CustomMagazine")) { + if (gunData.getAmmo() >= gunData.magazine()) { tag.putInt("reload_stage", 3); } @@ -685,7 +677,7 @@ public class GunEventHandler { if ((tag.getInt("iterative") == 1 && tag.getInt("reload_stage") == 3) || tag.getBoolean("force_stage3_start")) { tag.putInt("reload_stage", 3); tag.putBoolean("force_stage3_start", false); - int finishTime = GunsTool.getGunIntTag(tag, "FinishTime"); + int finishTime = gunData.finishTime(); tag.putInt("finish", finishTime + 2); player.getCooldowns().addCooldown(stack.getItem(), finishTime + 2); playGunEndReloadSounds(player); @@ -698,19 +690,20 @@ public class GunEventHandler { // 三阶段结束 if (tag.getInt("finish") == 1) { tag.putInt("reload_stage", 0); - if (GunsTool.getGunIntTag(tag, "BoltActionTime") > 0) { + if (gunData.boltActionTime() > 0) { GunsTool.setGunBooleanTag(tag, "NeedBoltAction", false); } - GunsTool.setGunBooleanTag(tag, "Reloading", false); + gunData.setReloadState(GunData.ReloadState.NOT_RELOADING); tag.putBoolean("start_single_reload", false); NeoForge.EVENT_BUS.post(new ReloadEvent.Post(player, stack)); } + + gunData.save(); } - public static void singleLoad(Player player, final CompoundTag tag) { - final var data = tag.getCompound("GunData"); - data.putInt("Ammo", data.getInt("Ammo") + 1); + public static void singleLoad(Player player, GunData data) { + data.setAmmo(data.getAmmo() + 1); if (!InventoryTool.hasCreativeAmmoBox(player)) { var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE); @@ -753,7 +746,7 @@ public class GunEventHandler { public static void playGunEmptyPrepareSounds(Player player) { ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return; - final var tag = NBTTool.getTag(stack); + var data = GunData.from(stack); if (!player.level().isClientSide) { String origin = stack.getItem().getDescriptionId(); @@ -766,7 +759,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) (GunsTool.getGunIntTag(tag, "PrepareEmptyTime") / 2 + 3 + 1.5 * shooterHeight), () -> { + Mod.queueServerWork((int) (data.prepareEmptyTime() / 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)) { @@ -849,9 +842,10 @@ public class GunEventHandler { /** * 哨兵充能 */ - private static void handleSentinelCharge(Player player, final CompoundTag tag) { + private static void handleSentinelCharge(Player player, GunData gunData) { if (!(player.getMainHandItem().getItem() instanceof GunItem)) return; - final var data = tag.getCompound("GunData"); + var tag = gunData.getTag(); + final var data = gunData.getData(); // 启动换弹 if (GunsTool.getGunBooleanTag(tag, "StartCharge")) { @@ -896,5 +890,7 @@ public class GunEventHandler { if (GunsTool.getGunIntTag(tag, "ChargeTime") == 1) { data.putBoolean("Charging", false); } + + gunData.save(); } } diff --git a/src/main/java/com/atsuishio/superbwarfare/event/LivingEventHandler.java b/src/main/java/com/atsuishio/superbwarfare/event/LivingEventHandler.java index 5ce28aceb..545bd8c72 100644 --- a/src/main/java/com/atsuishio/superbwarfare/event/LivingEventHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/event/LivingEventHandler.java @@ -14,6 +14,7 @@ import com.atsuishio.superbwarfare.entity.vehicle.base.ContainerMobileVehicleEnt import com.atsuishio.superbwarfare.entity.vehicle.base.VehicleEntity; import com.atsuishio.superbwarfare.event.events.PreKillEvent; import com.atsuishio.superbwarfare.init.*; +import com.atsuishio.superbwarfare.item.gun.GunData; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.network.message.receive.ClientIndicatorMessage; import com.atsuishio.superbwarfare.network.message.receive.DrawClientMessage; @@ -167,6 +168,7 @@ public class LivingEventHandler { double armorValue; armorValue = tag.getDouble("ArmorPlate"); tag.putDouble("ArmorPlate", Math.max(tag.getDouble("ArmorPlate") - damage, 0)); + NBTTool.saveTag(stack, tag); damage = Math.max(damage - armorValue, 0); } @@ -208,22 +210,22 @@ public class LivingEventHandler { if (!stack.is(ModTags.Items.GUN)) return; if (event.getEntity() instanceof TargetEntity) return; + var data = GunData.from(stack).reload(); double amount = Math.min(0.125 * event.getAmount(), event.getEntity().getMaxHealth()); final var tag = NBTTool.getTag(stack); // 先处理发射器类武器或高爆弹的爆炸伤害 if (source.is(ModDamageTypes.PROJECTILE_BOOM)) { if (stack.is(ModTags.Items.LAUNCHER) || PerkHelper.getItemPerkLevel(ModPerks.HE_BULLET.get(), tag) > 0) { - GunsTool.setGunDoubleTag(tag, "Exp", GunsTool.getGunDoubleTag(tag, "Exp") + amount); + data.setExp(data.getExp() + amount); } } // 再判断是不是枪械能造成的伤害 if (!DamageTypeTool.isGunDamage(source)) return; - GunsTool.setGunDoubleTag(tag, "Exp", GunsTool.getGunDoubleTag(tag, "Exp") + amount); - - NBTTool.saveTag(stack, tag); + data.setExp(data.getExp() + amount); + data.save(); } private static void giveKillExpToWeapon(LivingDeathEvent event) { @@ -234,35 +236,36 @@ public class LivingEventHandler { if (!stack.is(ModTags.Items.GUN)) return; if (event.getEntity() instanceof TargetEntity) return; + var data = GunData.from(stack).reload(); double amount = 20 + 2 * event.getEntity().getMaxHealth(); final var tag = NBTTool.getTag(stack); // 先处理发射器类武器或高爆弹的爆炸伤害 if (source.is(ModDamageTypes.PROJECTILE_BOOM)) { if (stack.is(ModTags.Items.LAUNCHER) || PerkHelper.getItemPerkLevel(ModPerks.HE_BULLET.get(), tag) > 0) { - GunsTool.setGunDoubleTag(tag, "Exp", GunsTool.getGunDoubleTag(tag, "Exp") + amount); + data.setExp(data.getExp() + amount); } } // 再判断是不是枪械能造成的伤害 if (DamageTypeTool.isGunDamage(source)) { - GunsTool.setGunDoubleTag(tag, "Exp", GunsTool.getGunDoubleTag(tag, "Exp") + amount); + data.setExp(data.getExp() + amount); } // 提升武器等级 - int level = GunsTool.getGunIntTag(tag, "Level"); - double exp = GunsTool.getGunDoubleTag(tag, "Exp"); + int level = data.getLevel(); + double exp = data.getExp(); double upgradeExpNeeded = 20 * Math.pow(level, 2) + 160 * level + 20; while (exp >= upgradeExpNeeded) { exp -= upgradeExpNeeded; - level = GunsTool.getGunIntTag(tag, "Level") + 1; + level = data.getLevel() + 1; upgradeExpNeeded = 20 * Math.pow(level, 2) + 160 * level + 20; - GunsTool.setGunDoubleTag(tag, "Exp", exp); - GunsTool.setGunIntTag(tag, "Level", level); - GunsTool.setGunDoubleTag(tag, "UpgradePoint", GunsTool.getGunDoubleTag(tag, "UpgradePoint") + 0.5); + data.setExp(exp); + data.setLevel(level); + data.setUpgradePoint(data.getUpgradePoint() + 0.5); } - NBTTool.saveTag(stack, tag); + data.save(); } private static void handleGunLevels(LivingIncomingDamageEvent event) { @@ -273,20 +276,20 @@ public class LivingEventHandler { if (!stack.is(ModTags.Items.GUN)) return; if (event.getEntity() instanceof TargetEntity) return; - final var tag = NBTTool.getTag(stack); - int level = GunsTool.getGunIntTag(tag, "Level"); - double exp = GunsTool.getGunDoubleTag(tag, "Exp"); + var data = GunData.from(stack).reload(); + int level = data.getLevel(); + double exp = data.getExp(); double upgradeExpNeeded = 20 * Math.pow(level, 2) + 160 * level + 20; while (exp >= upgradeExpNeeded) { exp -= upgradeExpNeeded; - level = GunsTool.getGunIntTag(tag, "Level") + 1; + level = data.getLevel() + 1; upgradeExpNeeded = 20 * Math.pow(level, 2) + 160 * level + 20; - GunsTool.setGunDoubleTag(tag, "Exp", exp); - GunsTool.setGunIntTag(tag, "Level", level); - GunsTool.setGunDoubleTag(tag, "UpgradePoint", GunsTool.getGunDoubleTag(tag, "UpgradePoint") + 0.5); + data.setExp(exp); + data.setLevel(level); + data.setUpgradePoint(data.getUpgradePoint() + 0.5); } - NBTTool.saveTag(stack, tag); + data.save(); } private static void killIndication(LivingDeathEvent event) { @@ -353,23 +356,22 @@ public class LivingEventHandler { if (oldStack.getItem() instanceof GunItem oldGun) { stopGunReloadSound(serverPlayer, oldGun); - CompoundTag data = oldTag.getCompound("GunData"); + var oldData = GunData.from(oldStack).reload(); + CompoundTag data = oldData.getData(); - if (GunsTool.getGunDoubleTag(oldTag, "BoltActionTime") > 0) { + if (oldData.boltActionTime() > 0) { data.putInt("BoltActionTick", 0); } data.putInt("ReloadTime", 0); oldTag.put("GunData", data); - oldTag.putBoolean("is_normal_reloading", false); - oldTag.putBoolean("is_empty_reloading", false); + oldData.setReloadState(GunData.ReloadState.NOT_RELOADING); - if (GunsTool.getGunIntTag(oldTag, "IterativeTime") != 0) { + if (oldData.iterativeTime() != 0) { oldTag.putBoolean("force_stop", false); oldTag.putBoolean("stop", false); oldTag.putInt("reload_stage", 0); - data.putBoolean("Reloading", false); oldTag.putDouble("prepare", 0); oldTag.putDouble("prepare_load", 0); oldTag.putDouble("iterative", 0); @@ -389,23 +391,24 @@ public class LivingEventHandler { } if (newStack.getItem() instanceof GunItem) { + var newData = GunData.from(newStack); + player.getPersistentData().putDouble("noRun", 40); newTag.putBoolean("draw", true); - if (GunsTool.getGunIntTag(newTag, "BoltActionTime") > 0) { + if (newData.boltActionTime() > 0) { GunsTool.setGunIntTag(newTag, "BoltActionTick", 0); } - newTag.putBoolean("is_normal_reloading", false); - newTag.putBoolean("is_empty_reloading", false); + + newData.setReloadState(GunData.ReloadState.NOT_RELOADING); CompoundTag data = newTag.getCompound("GunData"); data.putInt("ReloadTime", 0); newTag.put("GunData", data); - if (GunsTool.getGunIntTag(newTag, "IterativeTime") != 0) { + if (newData.iterativeTime() != 0) { newTag.putBoolean("force_stop", false); newTag.putBoolean("stop", false); newTag.putInt("reload_stage", 0); - GunsTool.setGunBooleanTag(newTag, "Reloading", false); newTag.putDouble("prepare", 0); newTag.putDouble("prepare_load", 0); newTag.putDouble("iterative", 0); @@ -653,8 +656,9 @@ public class LivingEventHandler { var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE); if (cap == null) return; - int mag = GunsTool.getGunIntTag(tag, "Magazine") + GunsTool.getGunIntTag(tag, "CustomMagazine"); - int ammo = GunsTool.getGunIntTag(tag, "Ammo"); + var data = GunData.from(stack); + int mag = data.magazine(); + int ammo = data.getAmmo(); int ammoReload = (int) Math.min(mag, mag * rate); int ammoNeed = Math.min(mag - ammo, ammoReload); @@ -667,7 +671,7 @@ public class LivingEventHandler { } else { cap.rifleAmmo -= ammoFinal; } - GunsTool.setGunIntTag(tag, "Ammo", Math.min(mag, ammo + ammoFinal)); + data.setAmmo(Math.min(mag, ammo + ammoFinal)); } else if (stack.is(ModTags.Items.USE_HANDGUN_AMMO)) { int ammoFinal = Math.min(cap.handgunAmmo, ammoNeed); if (flag) { @@ -675,9 +679,9 @@ public class LivingEventHandler { } else { cap.handgunAmmo -= ammoFinal; } - GunsTool.setGunIntTag(tag, "Ammo", Math.min(mag, ammo + ammoFinal)); + data.setAmmo(Math.min(mag, ammo + ammoFinal)); } - NBTTool.saveTag(stack, tag); + data.save(); cap.syncPlayerVariables(player); } diff --git a/src/main/java/com/atsuishio/superbwarfare/event/PlayerEventHandler.java b/src/main/java/com/atsuishio/superbwarfare/event/PlayerEventHandler.java index 55a1c9468..9ff95181a 100644 --- a/src/main/java/com/atsuishio/superbwarfare/event/PlayerEventHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/event/PlayerEventHandler.java @@ -6,6 +6,7 @@ import com.atsuishio.superbwarfare.config.server.MiscConfig; import com.atsuishio.superbwarfare.init.ModItems; import com.atsuishio.superbwarfare.init.ModSounds; import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.GunData; import com.atsuishio.superbwarfare.tools.*; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; @@ -115,9 +116,8 @@ public class PlayerEventHandler { int sprintCost; if (stack.is(ModTags.Items.GUN)) { - final var tag = NBTTool.getTag(stack); - double weight = GunsTool.getGunDoubleTag(tag, "Weight") + GunsTool.getGunDoubleTag(tag, "CustomWeight"); - sprintCost = (int) (5 + 0.2 * weight); + var data = GunData.from(stack); + sprintCost = (int) (5 + 0.2 * data.weight()); } else { sprintCost = 5; } @@ -197,10 +197,12 @@ public class PlayerEventHandler { private static void handleSpecialWeaponAmmo(Player player) { ItemStack stack = player.getMainHandItem(); - final var tag = NBTTool.getTag(stack); - if ((stack.is(ModItems.RPG.get()) || stack.is(ModItems.BOCEK.get())) && GunsTool.getGunIntTag(tag, "Ammo") == 1) { + var data = GunData.from(stack); + var tag = data.getTag(); + + if ((stack.is(ModItems.RPG.get()) || stack.is(ModItems.BOCEK.get())) && data.getAmmo() == 1) { tag.putDouble("empty", 0); - NBTTool.saveTag(stack, tag); + data.save(); } } @@ -263,49 +265,50 @@ public class PlayerEventHandler { for (ItemStack stack : player.getInventory().items) { if (stack.is(ModTags.Items.GUN)) { - final var tag = NBTTool.getTag(stack); + var data = GunData.from(stack).reload(); + var tag = data.getTag(); + if (!InventoryTool.hasCreativeAmmoBox(player)) { var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE); if (cap == null) return; if (stack.is(ModTags.Items.USE_SHOTGUN_AMMO) && cap.shotgunAmmo > 0) { - GunsTool.reload(player, stack, tag, AmmoType.SHOTGUN); + GunsTool.reload(player, stack, data, AmmoType.SHOTGUN); } if (stack.is(ModTags.Items.USE_SNIPER_AMMO) && cap.sniperAmmo > 0) { - GunsTool.reload(player, stack, tag, AmmoType.SNIPER); + GunsTool.reload(player, stack, data, AmmoType.SNIPER); } if (stack.is(ModTags.Items.USE_HANDGUN_AMMO) && cap.handgunAmmo > 0) { - GunsTool.reload(player, stack, tag, AmmoType.HANDGUN); + GunsTool.reload(player, stack, data, AmmoType.HANDGUN); } if (stack.is(ModTags.Items.USE_RIFLE_AMMO) && cap.rifleAmmo > 0) { - GunsTool.reload(player, stack, tag, AmmoType.RIFLE); + GunsTool.reload(player, stack, data, AmmoType.RIFLE); } if (stack.is(ModTags.Items.USE_HEAVY_AMMO) && cap.heavyAmmo > 0) { - GunsTool.reload(player, stack, tag, AmmoType.HEAVY); + GunsTool.reload(player, stack, data, AmmoType.HEAVY); } if (stack.getItem() == ModItems.TASER.get() && GunsTool.getGunIntTag(tag, "MaxAmmo") > 0 && GunsTool.getGunIntTag(tag, "Ammo") == 0) { - GunsTool.setGunIntTag(tag, "Ammo", 1); + 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 && GunsTool.getGunIntTag(tag, "Ammo") == 0) { - GunsTool.setGunIntTag(tag, "Ammo", 1); + 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 && GunsTool.getGunIntTag(tag, "Ammo") == 0) { - GunsTool.setGunIntTag(tag, "Ammo", 1); + 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 && GunsTool.getGunIntTag(tag, "Ammo") == 0) { - GunsTool.setGunIntTag(tag, "Ammo", 1); + data.setAmmo(1); player.getInventory().clearOrCountMatchingItems(p -> p.getItem() == ModItems.JAVELIN_MISSILE.get(), 1, player.inventoryMenu.getCraftSlots()); } } else { - GunsTool.setGunIntTag(tag, "Ammo", GunsTool.getGunIntTag(tag, "Magazine") - + GunsTool.getGunIntTag(tag, "CustomMagazine")); + data.setAmmo(data.magazine()); } GunsTool.setGunBooleanTag(tag, "HoldOpen", false); - NBTTool.saveTag(stack, tag); + data.save(); } } } @@ -353,9 +356,9 @@ public class PlayerEventHandler { if (left.is(ModTags.Items.GUN) && right.getItem() == ModItems.SHORTCUT_PACK.get()) { ItemStack output = left.copy(); - final var outputTag = NBTTool.getTag(output); - GunsTool.setGunDoubleTag(outputTag, "UpgradePoint", GunsTool.getGunDoubleTag(outputTag, "UpgradePoint") + 1); - NBTTool.saveTag(output, outputTag); + var data = GunData.from(output).reload(); + data.setUpgradePoint(data.getUpgradePoint() + 1); + data.save(); event.setOutput(output); event.setCost(10); diff --git a/src/main/java/com/atsuishio/superbwarfare/item/ContainerBlockItem.java b/src/main/java/com/atsuishio/superbwarfare/item/ContainerBlockItem.java index 4048177db..ab59d34ea 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/ContainerBlockItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/ContainerBlockItem.java @@ -9,6 +9,7 @@ import com.atsuishio.superbwarfare.init.ModItems; import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; import net.minecraft.core.component.DataComponents; import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.InteractionResultHolder; @@ -186,4 +187,15 @@ public class ContainerBlockItem extends BlockItem implements GeoItem { return stack; } + + @Override + public @NotNull Component getHighlightTip(@NotNull ItemStack item, @NotNull Component displayName) { +// var tag = item.getOrDefault(DataComponents.CUSTOM_DATA, CustomData.EMPTY).copyTag(); +// String entityTranslationKey = getEntityTranslationKey(tag.getString("EntityType")); +// +// super.getHighlightTip(item, displayName). +// +// tooltipComponents.add(Component.translatable(entityTranslationKey == null ? "des.superbwarfare.container.empty" : s).withStyle(ChatFormatting.GRAY)); + return Component.literal("tesjlktkjesjlktlejk"); + } } diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/GunData.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/GunData.java new file mode 100644 index 000000000..809319684 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/GunData.java @@ -0,0 +1,294 @@ +package com.atsuishio.superbwarfare.item.gun; + +import com.atsuishio.superbwarfare.tools.GunsTool; +import net.minecraft.core.component.DataComponents; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.Mth; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.CustomData; + +import java.util.HashMap; +import java.util.WeakHashMap; + +public class GunData { + private final ItemStack stack; + private final GunItem item; + private CompoundTag tag; + private CompoundTag data; + private final String id; + + private static final WeakHashMap dataCache = new WeakHashMap<>(); + + public GunData reload() { + var customData = stack.get(DataComponents.CUSTOM_DATA); + this.tag = customData != null ? customData.copyTag() : new CompoundTag(); + + if (!tag.contains("GunData")) { + data = new CompoundTag(); + tag.put("GunData", data); + } else { + data = tag.getCompound("GunData"); + } + return this; + } + + private GunData(ItemStack stack) { + if (!(stack.getItem() instanceof GunItem gunItem)) { + throw new IllegalArgumentException("stack is not GunItem!"); + } + this.item = gunItem; + this.stack = stack; + var id = stack.getDescriptionId(); + this.id = id.substring(id.lastIndexOf(".") + 1); + reload(); + } + + public static GunData from(ItemStack stack) { + if (!dataCache.containsKey(stack)) { + dataCache.put(stack, new GunData(stack)); + } + return dataCache.get(stack); + } + + public GunItem getItem() { + return item; + } + + public ItemStack getStack() { + return stack; + } + + public CompoundTag getTag() { + return tag; + } + + public CompoundTag getData() { + return data; + } + + private double getGunData(String key) { + return getGunData(key, 0); + } + + private double getGunData(String key, double defaultValue) { + return GunsTool.gunsData.getOrDefault(id, new HashMap<>()).getOrDefault(key, defaultValue); + } + + public double damage() { + return getGunData("Damage") + item.getCustomDamage(stack); + } + + public double explosionDamage() { + return getGunData("ExplosionDamage"); + } + + public double explosionRadius() { + return getGunData("ExplosionRadius"); + } + + public double velocity() { + return getGunData("Velocity") + item.getCustomVelocity(stack); + } + + public double spread() { + return getGunData("Spread"); + } + + public int magazine() { + return (int) (getGunData("Magazine") + item.getCustomMagazine(stack)); + } + + public int projectileAmount() { + return (int) getGunData("ProjectileAmount", 1); + } + + public double headshot() { + return getGunData("Headshot", 1.5) + item.getCustomHeadshot(stack); + } + + public int normalReloadTime() { + return (int) getGunData("NormalReloadTime"); + } + + public int emptyReloadTime() { + return (int) getGunData("EmptyReloadTime"); + } + + public int iterativeTime() { + return (int) getGunData("IterativeTime"); + } + + public int prepareTime() { + return (int) getGunData("PrepareTime"); + } + + public int prepareLoadTime() { + return (int) getGunData("PrepareLoadTime"); + } + + public int prepareEmptyTime() { + return (int) getGunData("PrepareEmptyTime"); + } + + public int boltActionTime() { + return (int) getGunData("BoltActionTime") + item.getCustomBoltActionTime(stack); + } + + public int finishTime() { + return (int) getGunData("FinishTime"); + } + + public int reloadTime() { + var normalReload = normalReloadTime(); + var emptyReload = emptyReloadTime(); + + if (normalReload == 0) return emptyReload; + if (emptyReload == 0) return normalReload; + + return getAmmo() < magazine() ? normalReload : emptyReload; + } + + public double soundRadius() { + return getGunData("SoundRadius", 15) + item.getCustomSoundRadius(stack); + } + + public double bypassArmor() { + return getGunData("BypassesArmor") + item.getCustomBypassArmor(stack); + } + + public double recoilX() { + return getGunData("RecoilX"); + } + + public double recoilY() { + return getGunData("RecoilY"); + } + + public double weight() { + return getGunData("Weight") + customWeight(); + } + + public double customWeight() { + return item.getCustomWeight(stack); + } + + public int getAmmo() { + return data.getInt("Ammo"); + } + + public void setAmmo(int ammo) { + data.putInt("Ammo", ammo); + } + + public boolean isReloading() { + return getReloadState() != ReloadState.NOT_RELOADING; + } + + public double defaultZoom() { + return getGunData("DefaultZoom", 1); + } + + public double minZoom() { + return getGunData("MinZoom", 1); + } + + public double maxZoom() { + return getGunData("MaxZoom", 1); + } + + public double zoom() { + if (minZoom() == maxZoom()) return defaultZoom(); + + return Mth.clamp(defaultZoom() + item.getCustomZoom(stack), minZoom(), maxZoom()); + } + + public int rpm() { + return (int) (getGunData("RPM") + item.getCustomRPM(stack)); + } + + public int burstAmount() { + return (int) getGunData("BurstAmount"); + } + + public int getFireMode() { + if (data.contains("FireMode")) { + return data.getInt("FireMode"); + } + return (int) getGunData("FireMode"); + } + + public void setFireMode(int fireMode) { + data.putInt("FireMode", fireMode); + } + + public int getLevel() { + return data.getInt("Level"); + } + + public void setLevel(int level) { + data.putInt("Level", level); + } + + public double getExp() { + return data.getDouble("Exp"); + } + + public void setExp(double exp) { + data.putDouble("Exp", exp); + } + + public double getUpgradePoint() { + return data.getDouble("UpgradePoint"); + } + + public void setUpgradePoint(double upgradePoint) { + data.putDouble("UpgradePoint", upgradePoint); + } + + public boolean canAdjustZoom() { + return item.canAdjustZoom(stack); + } + + public boolean canSwitchScope() { + return item.canSwitchScope(stack); + } + + public enum ReloadState { + NOT_RELOADING, + NORMAL_RELOADING, + EMPTY_RELOADING, + } + + public ReloadState getReloadState() { + return switch (data.getInt("ReloadState")) { + case 1 -> ReloadState.NORMAL_RELOADING; + case 2 -> ReloadState.EMPTY_RELOADING; + default -> ReloadState.NOT_RELOADING; + }; + } + + public boolean normalReloading() { + return getReloadState() == ReloadState.NORMAL_RELOADING; + } + + public boolean emptyReloading() { + return getReloadState() == ReloadState.EMPTY_RELOADING; + } + + public void setReloadState(ReloadState state) { + data.putInt("ReloadState", state.ordinal()); + } + + public int getReloadStage() { + return data.getInt("ReloadStage"); + } + + public void setReloadStage(int stage) { + data.putInt("ReloadStage", stage); + } + + public void save() { + stack.set(DataComponents.CUSTOM_DATA, CustomData.of(tag)); + reload(); + } +} 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 b0128e09d..105599700 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/GunItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/GunItem.java @@ -12,7 +12,6 @@ import com.atsuishio.superbwarfare.perk.Perk; import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.tools.AmmoType; import com.atsuishio.superbwarfare.tools.GunsTool; -import com.atsuishio.superbwarfare.tools.NBTTool; import net.minecraft.client.model.HumanoidModel; import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; import net.minecraft.core.BlockPos; @@ -66,7 +65,8 @@ public abstract class GunItem extends Item implements CustomRendererItem { || !(stack.getItem() instanceof GunItem gunItem) ) return; - var tag = NBTTool.getTag(stack); + var data = GunData.from(stack); + var tag = data.getTag(); if (tag.getString("id").isEmpty()) { var id = stack.getDescriptionId(); @@ -77,28 +77,28 @@ public abstract class GunItem extends Item implements CustomRendererItem { var name = this.getDescriptionId().substring(this.getDescriptionId().lastIndexOf('.') + 1); if (level.getServer() != null && entity instanceof Player player && player.isCreative()) { - GunsTool.initCreativeGun(tag, name); + GunsTool.initCreativeGun(stack, name); } else { GunsTool.initGun(tag, name); } + data.reload(); + tag = data.getTag(); GunsTool.generateAndSetUUID(tag); tag.putBoolean("init", true); } tag.putBoolean("draw", false); - handleGunPerks(tag); - handleGunAttachment(tag); + data.save(); + handleGunPerks(data); + data.reload(); var hasBulletInBarrel = gunItem.hasBulletInBarrel(stack); - var ammoCount = GunsTool.getGunIntTag(tag, "Ammo"); - var magazine = GunsTool.getGunIntTag(tag, "Magazine"); - var customMagazine = GunsTool.getGunIntTag(tag, "CustomMagazine"); + var ammoCount = data.getAmmo(); + var magazine = data.magazine(); - if ((hasBulletInBarrel && ammoCount > magazine + customMagazine + 1) - || (!hasBulletInBarrel && ammoCount > magazine + customMagazine) - ) { - int count = ammoCount - magazine + customMagazine - (hasBulletInBarrel ? 1 : 0); + if ((hasBulletInBarrel && ammoCount > magazine + 1) || (!hasBulletInBarrel && ammoCount > magazine)) { + int count = ammoCount - magazine - (hasBulletInBarrel ? 1 : 0); var capability = entity.getCapability(ModCapabilities.PLAYER_VARIABLE); if (capability != null) { @@ -115,9 +115,9 @@ public abstract class GunItem extends Item implements CustomRendererItem { } capability.syncPlayerVariables(entity); } - GunsTool.setGunIntTag(tag, "Ammo", magazine + customMagazine + (hasBulletInBarrel ? 1 : 0)); + GunsTool.setGunIntTag(tag, "Ammo", magazine + (hasBulletInBarrel ? 1 : 0)); } - NBTTool.saveTag(stack, tag); + data.save(); } @Override @@ -131,12 +131,12 @@ public abstract class GunItem extends Item implements CustomRendererItem { @Override public @NotNull ItemAttributeModifiers getDefaultAttributeModifiers(@NotNull ItemStack stack) { var list = new ArrayList<>(super.getDefaultAttributeModifiers(stack).modifiers()); - var tag = NBTTool.getTag(stack); + var data = GunData.from(stack); list.add(new ItemAttributeModifiers.Entry( Attributes.MOVEMENT_SPEED, new AttributeModifier(SPEED_ID, - -0.01f - 0.005f * (GunsTool.getGunDoubleTag(tag, "Weight") + GunsTool.getGunDoubleTag(tag, "CustomWeight")), + -0.01f - 0.005f * data.weight(), AttributeModifier.Operation.ADD_MULTIPLIED_BASE ), EquipmentSlotGroup.MAINHAND @@ -179,7 +179,9 @@ public abstract class GunItem extends Item implements CustomRendererItem { } - private void handleGunPerks(final CompoundTag tag) { + private void handleGunPerks(GunData data) { + var tag = data.getTag(); + reducePerkTagCoolDown(tag, "HealClipTime", "KillClipReloadTime", "KillClipTime", "FourthTimesCharmTick", "HeadSeeker", "DesperadoTime", "DesperadoTimePost"); @@ -189,52 +191,13 @@ public abstract class GunItem extends Item implements CustomRendererItem { GunsTool.setPerkIntTag(tag, "FourthTimesCharmTick", 0); GunsTool.setPerkIntTag(tag, "FourthTimesCharmCount", 0); - int mag = GunsTool.getGunIntTag(tag, "Magazine") + GunsTool.getGunIntTag(tag, "CustomMagazine"); + int mag = data.magazine(); GunsTool.setGunIntTag(tag, "Ammo", Math.min(mag, GunsTool.getGunIntTag(tag, "Ammo") + 2)); + data.save(); } } } - private void handleGunAttachment(final CompoundTag rootTag) { - CompoundTag tag = rootTag.getCompound("Attachments"); - - double scopeWeight = switch (tag.getInt("Scope")) { - case 1 -> 0.5; - case 2 -> 1; - case 3 -> 1.5; - default -> 0; - }; - - double barrelWeight = switch (tag.getInt("Barrel")) { - case 1 -> 0.5; - case 2 -> 1; - default -> 0; - }; - - double magazineWeight = switch (tag.getInt("Magazine")) { - case 1 -> 1; - case 2 -> 2; - default -> 0; - }; - - double stockWeight = switch (tag.getInt("Stock")) { - case 1 -> -2; - case 2 -> 1.5; - default -> 0; - }; - - double gripWeight = switch (tag.getInt("Grip")) { - case 1, 2 -> 0.25; - case 3 -> 1; - default -> 0; - }; - - double soundRadius = tag.getInt("Barrel") == 2 ? 0.6 : 1; - - GunsTool.setGunDoubleTag(tag, "CustomWeight", scopeWeight + barrelWeight + magazineWeight + stockWeight + gripWeight); - GunsTool.setGunDoubleTag(tag, "CustomSoundRadius", soundRadius); - } - public boolean canApplyPerk(Perk perk) { return true; } @@ -405,6 +368,121 @@ public abstract class GunItem extends Item implements CustomRendererItem { return 0; } + /** + * 获取额外伤害加成 + */ + public double getCustomDamage(ItemStack stack) { + return 0; + } + + /** + * 获取额外爆头伤害加成 + */ + public double getCustomHeadshot(ItemStack stack) { + return 0; + } + + /** + * 获取额外护甲穿透加成 + */ + public double getCustomBypassArmor(ItemStack stack) { + return 0; + } + + /** + * 获取额外弹匣容量加成 + */ + public int getCustomMagazine(ItemStack stack) { + return 0; + } + + /** + * 获取额外缩放倍率加成 + */ + public double getCustomZoom(ItemStack stack) { + return 0; + } + + /** + * 获取额外RPM加成 + */ + public int getCustomRPM(ItemStack stack) { + return 0; + } + + /** + * 获取额外总重量加成 + */ + public double getCustomWeight(ItemStack stack) { + CompoundTag tag = GunData.from(stack).getTag().getCompound("Attachments"); + + double scopeWeight = switch (tag.getInt("Scope")) { + case 1 -> 0.5; + case 2 -> 1; + case 3 -> 1.5; + default -> 0; + }; + + double barrelWeight = switch (tag.getInt("Barrel")) { + case 1 -> 0.5; + case 2 -> 1; + default -> 0; + }; + + double magazineWeight = switch (tag.getInt("Magazine")) { + case 1 -> 1; + case 2 -> 2; + default -> 0; + }; + + double stockWeight = switch (tag.getInt("Stock")) { + case 1 -> -2; + case 2 -> 1.5; + default -> 0; + }; + + double gripWeight = switch (tag.getInt("Grip")) { + case 1, 2 -> 0.25; + case 3 -> 1; + default -> 0; + }; + + return scopeWeight + barrelWeight + magazineWeight + stockWeight + gripWeight; + } + + /** + * 获取额外弹速加成 + */ + public double getCustomVelocity(ItemStack stack) { + return 0; + } + + /** + * 获取额外音效半径加成 + */ + public double getCustomSoundRadius(ItemStack stack) { + return GunData.from(stack).getTag().getCompound("Attachments").getInt("Barrel") == 2 ? 0.6 : 1; + } + + public int getCustomBoltActionTime(ItemStack stack) { + return 0; + } + + /** + * 是否允许缩放 + */ + public boolean canAdjustZoom(ItemStack stack) { + return false; + } + + /** + * 是否允许切换瞄具 + */ + public boolean canSwitchScope(ItemStack stack) { + return false; + } + + /** * 右下角弹药显示名称 */ 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 abf9eaf61..35f5460e6 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 @@ -5,10 +5,10 @@ import com.atsuishio.superbwarfare.client.renderer.item.Glock17ItemRenderer; import com.atsuishio.superbwarfare.event.ClientEventHandler; 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.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; @@ -49,11 +49,11 @@ public class Glock17Item extends GunItem implements GeoItem { ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; - if (NBTTool.getTag(stack).getBoolean("is_empty_reloading")) { + if (GunData.from(stack).emptyReloading()) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.glock.reload_empty")); } - if (NBTTool.getTag(stack).getBoolean("is_normal_reloading")) { + if (GunData.from(stack).normalReloading()) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.glock.reload_normal")); } @@ -69,7 +69,7 @@ public class Glock17Item extends GunItem implements GeoItem { if (player.isSprinting() && player.onGround() && player.getPersistentData().getDouble("noRun") == 0 - && !(NBTTool.getTag(stack).getBoolean("is_normal_reloading") || NBTTool.getTag(stack).getBoolean("is_empty_reloading")) && ClientEventHandler.drawTime < 0.01) { + && !(GunData.from(stack).normalReloading() || GunData.from(stack).emptyReloading()) && ClientEventHandler.drawTime < 0.01) { if (player.hasEffect(MobEffects.MOVEMENT_SPEED)) { return event.setAndContinue(RawAnimation.begin().thenLoop("animation.glock.run_fast")); } else { 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 a3400ef3f..8e080d87c 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 @@ -6,10 +6,10 @@ import com.atsuishio.superbwarfare.event.ClientEventHandler; 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.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,11 +50,11 @@ public class Glock18Item extends GunItem implements GeoItem { ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; - if (NBTTool.getTag(stack).getBoolean("is_empty_reloading")) { + if (GunData.from(stack).emptyReloading()) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.glock.reload_empty")); } - if (NBTTool.getTag(stack).getBoolean("is_normal_reloading")) { + if (GunData.from(stack).normalReloading()) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.glock.reload_normal")); } @@ -69,7 +69,7 @@ public class Glock18Item extends GunItem implements GeoItem { if (player.isSprinting() && player.onGround() && player.getPersistentData().getDouble("noRun") == 0 - && !(NBTTool.getTag(stack).getBoolean("is_normal_reloading") || NBTTool.getTag(stack).getBoolean("is_empty_reloading")) && ClientEventHandler.drawTime < 0.01) { + && !(GunData.from(stack).normalReloading() || GunData.from(stack).emptyReloading()) && ClientEventHandler.drawTime < 0.01) { if (player.hasEffect(MobEffects.MOVEMENT_SPEED)) { return event.setAndContinue(RawAnimation.begin().thenLoop("animation.glock.run_fast")); } else { 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 63d0b3b09..4bb9e0239 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 @@ -5,10 +5,10 @@ import com.atsuishio.superbwarfare.client.renderer.item.M1911ItemRenderer; import com.atsuishio.superbwarfare.event.ClientEventHandler; 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.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; @@ -49,11 +49,11 @@ public class M1911Item extends GunItem implements GeoItem { ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; - if (NBTTool.getTag(stack).getBoolean("is_empty_reloading")) { + if (GunData.from(stack).emptyReloading()) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.glock.reload_empty")); } - if (NBTTool.getTag(stack).getBoolean("is_normal_reloading")) { + if (GunData.from(stack).normalReloading()) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.glock.reload_normal")); } @@ -69,7 +69,7 @@ public class M1911Item extends GunItem implements GeoItem { if (player.isSprinting() && player.onGround() && player.getPersistentData().getDouble("noRun") == 0 - && !(NBTTool.getTag(stack).getBoolean("is_normal_reloading") || NBTTool.getTag(stack).getBoolean("is_empty_reloading")) && ClientEventHandler.drawTime < 0.01) { + && !(GunData.from(stack).normalReloading() || GunData.from(stack).emptyReloading()) && ClientEventHandler.drawTime < 0.01) { if (player.hasEffect(MobEffects.MOVEMENT_SPEED)) { return event.setAndContinue(RawAnimation.begin().thenLoop("animation.glock.run_fast")); } else { 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 b5c44ca3f..96a517e50 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 @@ -5,10 +5,10 @@ import com.atsuishio.superbwarfare.client.renderer.item.Mp443ItemRenderer; import com.atsuishio.superbwarfare.event.ClientEventHandler; 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.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; @@ -49,11 +49,11 @@ public class Mp443Item extends GunItem implements GeoItem { ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; - if (NBTTool.getTag(stack).getBoolean("is_empty_reloading")) { + if (GunData.from(stack).emptyReloading()) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.glock.reload_empty")); } - if (NBTTool.getTag(stack).getBoolean("is_normal_reloading")) { + if (GunData.from(stack).normalReloading()) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.glock.reload_normal")); } @@ -69,7 +69,7 @@ public class Mp443Item extends GunItem implements GeoItem { if (player.isSprinting() && player.onGround() && player.getPersistentData().getDouble("noRun") == 0 - && !(NBTTool.getTag(stack).getBoolean("is_normal_reloading") || NBTTool.getTag(stack).getBoolean("is_empty_reloading")) && ClientEventHandler.drawTime < 0.01) { + && !(GunData.from(stack).normalReloading() || GunData.from(stack).emptyReloading()) && ClientEventHandler.drawTime < 0.01) { if (player.hasEffect(MobEffects.MOVEMENT_SPEED)) { return event.setAndContinue(RawAnimation.begin().thenLoop("animation.glock.run_fast")); } else { 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 23fafbddb..143c886ab 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 @@ -1,12 +1,12 @@ package com.atsuishio.superbwarfare.item.gun.handgun; -import com.atsuishio.superbwarfare.Mod; import com.atsuishio.superbwarfare.capability.ModCapabilities; import com.atsuishio.superbwarfare.client.TooltipTool; import com.atsuishio.superbwarfare.client.renderer.item.TracheliumItemRenderer; import com.atsuishio.superbwarfare.event.ClientEventHandler; 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.perk.Perk; import com.atsuishio.superbwarfare.perk.PerkHelper; @@ -18,7 +18,6 @@ import net.minecraft.client.player.LocalPlayer; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Style; -import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvent; import net.minecraft.world.effect.MobEffects; import net.minecraft.world.entity.Entity; @@ -37,8 +36,6 @@ import javax.annotation.ParametersAreNonnullByDefault; import java.util.List; import java.util.Set; -import static com.atsuishio.superbwarfare.tools.NBTTool.saveTag; - public class Trachelium extends GunItem implements GeoItem { private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); @@ -108,7 +105,8 @@ public class Trachelium extends GunItem implements GeoItem { if (player == null) return PlayState.STOP; ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; - final var tag = NBTTool.getTag(stack); + var data = GunData.from(stack); + final var tag = data.getTag(); boolean stock = GunsTool.getAttachmentType(tag, GunsTool.AttachmentType.STOCK) == 2; boolean grip = GunsTool.getAttachmentType(tag, GunsTool.AttachmentType.GRIP) > 0 || GunsTool.getAttachmentType(tag, GunsTool.AttachmentType.SCOPE) > 0; @@ -129,7 +127,7 @@ public class Trachelium extends GunItem implements GeoItem { } } - if (NBTTool.getTag(stack).getBoolean("is_empty_reloading")) { + if (GunData.from(stack).emptyReloading()) { if (stock) { if (grip) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.trachelium.reload_stock_grip")); @@ -253,33 +251,64 @@ public class Trachelium extends GunItem implements GeoItem { if (scopeType == 3) { tags.putInt("Scope", 0); } + } - if (scopeType > 0 || gripType > 0) { - GunsTool.setGunDoubleTag(tag, "CustomVelocity", 15); - GunsTool.setGunDoubleTag(tag, "BypassesArmor", 0.4); - GunsTool.setGunDoubleTag(tag, "Damage", 21); - GunsTool.setGunDoubleTag(tag, "Headshot", 2.5); - } else { - GunsTool.setGunDoubleTag(tag, "CustomVelocity", 0); - GunsTool.setGunDoubleTag(tag, "BypassesArmor", 0.3); - GunsTool.setGunDoubleTag(tag, "Damage", 19); - GunsTool.setGunDoubleTag(tag, "Headshot", 2); + @Override + public int getCustomBoltActionTime(ItemStack stack) { + return GunData.from(stack).getTag().getBoolean("DA") ? 12 : 0; + } + + @Override + public boolean canSwitchScope(ItemStack stack) { + return GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.SCOPE) == 2; + } + + private boolean useSpecialAttributes(ItemStack stack) { + int scopeType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.SCOPE); + int gripType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.GRIP); + return scopeType > 0 || gripType > 0; + } + + @Override + public double getCustomDamage(ItemStack stack) { + if (useSpecialAttributes(stack)) { + return 2; } + return super.getCustomDamage(stack); + } - double customZoom = switch (scopeType) { + @Override + public double getCustomZoom(ItemStack stack) { + int scopeType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.SCOPE); + return switch (scopeType) { case 0, 1 -> 0; case 2 -> NBTTool.getTag(stack).getBoolean("ScopeAlt") ? 0 : 2.75; default -> 1; }; - - GunsTool.setGunBooleanTag(tag, "CanSwitchScope", scopeType == 2); - GunsTool.setGunDoubleTag(tag, "CustomZoom", customZoom); - saveTag(stack, tag); } @Override - public ResourceLocation getGunIcon() { - return Mod.loc("textures/gun_icon/trachelium_icon.png"); + public double getCustomVelocity(ItemStack stack) { + if (useSpecialAttributes(stack)) { + return 15; + } + return super.getCustomVelocity(stack); + } + + @Override + public double getCustomHeadshot(ItemStack stack) { + if (useSpecialAttributes(stack)) { + return 0.5; + } + return super.getCustomHeadshot(stack); + } + + @Override + public double getCustomBypassArmor(ItemStack stack) { + if (useSpecialAttributes(stack)) { + return 0.1; + } + return super.getCustomBypassArmor(stack); } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/heavy/Ntw20Item.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/heavy/Ntw20Item.java index 0e4801f6d..4a0d866b6 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/heavy/Ntw20Item.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/heavy/Ntw20Item.java @@ -7,6 +7,7 @@ import com.atsuishio.superbwarfare.event.ClientEventHandler; import com.atsuishio.superbwarfare.init.ModRarity; 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.perk.Perk; import com.atsuishio.superbwarfare.perk.PerkHelper; @@ -17,17 +18,14 @@ import net.minecraft.client.player.LocalPlayer; import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvent; import net.minecraft.world.effect.MobEffects; -import net.minecraft.world.entity.Entity; import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Level; import software.bernie.geckolib.animatable.GeoItem; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animation.*; import software.bernie.geckolib.renderer.GeoItemRenderer; import software.bernie.geckolib.util.GeckoLibUtil; -import javax.annotation.ParametersAreNonnullByDefault; import java.util.Set; public class Ntw20Item extends GunItem implements GeoItem { @@ -58,17 +56,18 @@ public class Ntw20Item extends GunItem implements GeoItem { if (player == null) return PlayState.STOP; ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; - final var tag = NBTTool.getTag(stack); + var data = GunData.from(stack); + final var tag = data.getTag(); if (GunsTool.getGunIntTag(tag, "BoltActionTick") > 0) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.ntw_20.shift")); } - if (tag.getBoolean("is_empty_reloading")) { + if (data.emptyReloading()) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.ntw_20.reload_empty")); } - if (tag.getBoolean("is_normal_reloading")) { + if (data.normalReloading()) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.ntw_20.reload_normal")); } @@ -80,11 +79,12 @@ public class Ntw20Item extends GunItem implements GeoItem { if (player == null) return PlayState.STOP; ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; - final var tag = NBTTool.getTag(stack); + var data = GunData.from(stack); + final var tag = data.getTag(); if (player.isSprinting() && player.onGround() && player.getPersistentData().getDouble("noRun") == 0 - && !(tag.getBoolean("is_normal_reloading") || tag.getBoolean("is_empty_reloading")) + && !(data.normalReloading() || data.emptyReloading()) && ClientEventHandler.drawTime < 0.01) { if (player.hasEffect(MobEffects.MOVEMENT_SPEED) && GunsTool.getGunIntTag(tag, "BoltActionTick") == 0) { return event.setAndContinue(RawAnimation.begin().thenLoop("animation.ntw_20.run_fast")); @@ -126,30 +126,27 @@ public class Ntw20Item extends GunItem implements GeoItem { } @Override - @ParametersAreNonnullByDefault - public void inventoryTick(ItemStack stack, Level world, Entity entity, int slot, boolean selected) { - super.inventoryTick(stack, world, entity, slot, selected); + public boolean canAdjustZoom(ItemStack stack) { + return GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.SCOPE) == 3; + } - final var tag = NBTTool.getTag(stack); - int scopeType = GunsTool.getAttachmentType(tag, GunsTool.AttachmentType.SCOPE); - int magType = GunsTool.getAttachmentType(tag, GunsTool.AttachmentType.MAGAZINE); + @Override + public double getCustomZoom(ItemStack stack) { + int scopeType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.SCOPE); + return switch (scopeType) { + case 0, 1 -> 0; + case 2 -> 2.25; + default -> GunsTool.getGunDoubleTag(NBTTool.getTag(stack), "CustomZoom"); + }; + } - int customMag = switch (magType) { + @Override + public int getCustomMagazine(ItemStack stack) { + return switch (GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.MAGAZINE)) { case 1 -> 3; case 2 -> 6; default -> 0; }; - - double customZoom = switch (scopeType) { - case 0, 1 -> 0; - case 2 -> 2.25; - default -> GunsTool.getGunDoubleTag(tag, "CustomZoom"); - }; - - tag.putBoolean("CanAdjustZoomFov", scopeType == 3); - GunsTool.setGunDoubleTag(tag, "CustomZoom", customZoom); - GunsTool.setGunIntTag(tag, "CustomMagazine", customMag); - NBTTool.saveTag(stack, tag); } @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 af0126afe..d463851b3 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 @@ -9,6 +9,7 @@ import com.atsuishio.superbwarfare.entity.projectile.JavelinMissileEntity; import com.atsuishio.superbwarfare.entity.vehicle.base.VehicleEntity; import com.atsuishio.superbwarfare.event.ClientEventHandler; import com.atsuishio.superbwarfare.init.*; +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; @@ -76,7 +77,7 @@ public class JavelinItem extends GunItem implements GeoItem, SpecialFireWeapon { ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; - if (NBTTool.getTag(stack).getBoolean("is_empty_reloading")) { + if (GunData.from(stack).emptyReloading()) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.javelin.reload")); } @@ -239,7 +240,8 @@ public class JavelinItem extends GunItem implements GeoItem, SpecialFireWeapon { private void fire(Player player) { Level level = player.level(); ItemStack stack = player.getMainHandItem(); - CompoundTag tag = NBTTool.getTag(stack); + var data = GunData.from(stack); + CompoundTag tag = data.getTag(); if (tag.getInt("SeekTime") < 20) return; @@ -252,11 +254,12 @@ public class JavelinItem extends GunItem implements GeoItem, SpecialFireWeapon { if (player.level() instanceof ServerLevel serverLevel) { JavelinMissileEntity missileEntity = new JavelinMissileEntity(player, level, - (float) GunsTool.getGunDoubleTag(tag, "Damage"), - (float) GunsTool.getGunDoubleTag(tag, "ExplosionDamage"), - (float) GunsTool.getGunDoubleTag(tag, "ExplosionRadius"), + (float) data.damage(), + (float) data.explosionDamage(), + (float) data.explosionRadius(), tag.getInt("GuideType"), - new Vec3(tag.getDouble("TargetPosX"), tag.getDouble("TargetPosY"), tag.getDouble("TargetPosZ"))); + new Vec3(tag.getDouble("TargetPosX"), tag.getDouble("TargetPosY"), tag.getDouble("TargetPosZ")) + ); var dmgPerk = PerkHelper.getPerkByType(tag, Perk.Type.DAMAGE); if (dmgPerk == ModPerks.MONSTER_HUNTER.get()) { @@ -285,8 +288,8 @@ public class JavelinItem extends GunItem implements GeoItem, SpecialFireWeapon { } player.getCooldowns().addCooldown(stack.getItem(), 10); - GunsTool.setGunIntTag(tag, "Ammo", GunsTool.getGunIntTag(tag, "Ammo") - 1); - NBTTool.saveTag(stack, tag); + data.setAmmo(data.getAmmo() - 1); + data.save(); } @Override @@ -302,9 +305,13 @@ public class JavelinItem extends GunItem implements GeoItem, SpecialFireWeapon { } @Override - public void fireOnPress(Player player, final CompoundTag tag) { + public void fireOnPress(Player player, CompoundTag tag) { + var stack = player.getMainHandItem(); + var data = GunData.from(stack); + tag = data.getTag(); + var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE); - if (cap != null && !cap.zoom || GunsTool.getGunIntTag(tag, "Ammo") <= 0) return; + if (cap != null && !cap.zoom || data.getAmmo() <= 0) return; Entity seekingEntity = SeekTool.seekEntity(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 6efc51781..23ed0b5bd 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 @@ -10,6 +10,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; @@ -77,7 +78,7 @@ public class M79Item extends GunItem implements GeoItem, SpecialFireWeapon { ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; - if (NBTTool.getTag(stack).getBoolean("is_empty_reloading")) { + if (GunData.from(stack).emptyReloading()) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m79.reload")); } @@ -172,19 +173,20 @@ public class M79Item extends GunItem implements GeoItem, SpecialFireWeapon { @Override public void fireOnPress(Player player, final CompoundTag tag) { ItemStack stack = player.getMainHandItem(); - - if (GunsTool.getGunBooleanTag(tag, "Reloading")) return; - if (player.getCooldowns().isOnCooldown(stack.getItem()) || GunsTool.getGunIntTag(tag, "Ammo") <= 0) return; + var data = GunData.from(stack); + if (data.isReloading()) return; + if (player.getCooldowns().isOnCooldown(stack.getItem()) || data.getAmmo() <= 0) return; var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE); boolean zooming = cap != null && cap.zoom; - double spread = GunsTool.getGunDoubleTag(tag, "Spread"); + double spread = data.spread(); if (player.level() instanceof ServerLevel serverLevel) { GunGrenadeEntity gunGrenadeEntity = new GunGrenadeEntity(player, serverLevel, - (float) GunsTool.getGunDoubleTag(tag, "Damage"), - (float) GunsTool.getGunDoubleTag(tag, "ExplosionDamage"), - (float) GunsTool.getGunDoubleTag(tag, "ExplosionRadius")); + (float) data.damage(), + (float) data.explosionDamage(), + (float) data.explosionRadius() + ); var dmgPerk = PerkHelper.getPerkByType(tag, Perk.Type.DAMAGE); if (dmgPerk == ModPerks.MONSTER_HUNTER.get()) { @@ -194,11 +196,11 @@ public class M79Item extends GunItem implements GeoItem, SpecialFireWeapon { gunGrenadeEntity.setNoGravity(PerkHelper.getPerkByType(tag, Perk.Type.AMMO) == ModPerks.MICRO_MISSILE.get()); - float velocity = (float) GunsTool.getGunDoubleTag(tag, "Velocity"); - int perkLevel = PerkHelper.getItemPerkLevel(ModPerks.MICRO_MISSILE.get(), tag); + float velocity = (float) data.velocity(); + int perkLevel = PerkHelper.getItemPerkLevel(ModPerks.MICRO_MISSILE.get(), data.getTag()); if (perkLevel > 0) { - gunGrenadeEntity.setExplosionRadius((float) GunsTool.getGunDoubleTag(tag, "ExplosionRadius") * 0.5f); - gunGrenadeEntity.setDamage((float) GunsTool.getGunDoubleTag(tag, "Damage") * (1.1f + perkLevel * 0.1f)); + gunGrenadeEntity.setExplosionRadius((float) data.explosionRadius() * 0.5f); + gunGrenadeEntity.setDamage((float) data.explosionDamage() * (1.1f + perkLevel * 0.1f)); velocity *= 1.2f; } @@ -223,6 +225,7 @@ public class M79Item extends GunItem implements GeoItem, SpecialFireWeapon { } player.getCooldowns().addCooldown(stack.getItem(), 2); - GunsTool.setGunIntTag(tag, "Ammo", GunsTool.getGunIntTag(tag, "Ammo") - 1); + 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 b6c60efaa..cfb175536 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 @@ -10,6 +10,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; @@ -76,9 +77,9 @@ public class RpgItem extends GunItem implements GeoItem, SpecialFireWeapon { if (player == null) return PlayState.STOP; 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 (tag.getBoolean("is_empty_reloading")) { + if (data.emptyReloading()) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.rpg.reload")); } @@ -180,24 +181,27 @@ public class RpgItem extends GunItem implements GeoItem, SpecialFireWeapon { } @Override - public void fireOnPress(Player player, final CompoundTag tag) { + public void fireOnPress(Player player, CompoundTag tag) { Level level = player.level(); ItemStack stack = player.getMainHandItem(); + var data = GunData.from(stack); + tag = data.getTag(); - if (GunsTool.getGunBooleanTag(tag, "Reloading") + if (data.isReloading() || player.getCooldowns().isOnCooldown(stack.getItem()) - || GunsTool.getGunIntTag(tag, "Ammo") <= 0 + || data.getAmmo() <= 0 ) return; var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE); boolean zoom = cap != null && cap.zoom; - double spread = GunsTool.getGunDoubleTag(tag, "Spread"); + double spread = data.spread(); if (player.level() instanceof ServerLevel serverLevel) { RpgRocketEntity rocket = new RpgRocketEntity(player, level, - (float) GunsTool.getGunDoubleTag(tag, "Damage"), - (float) GunsTool.getGunDoubleTag(tag, "ExplosionDamage"), - (float) GunsTool.getGunDoubleTag(tag, "ExplosionRadius")); + (float) data.damage(), + (float) data.explosionDamage(), + (float) data.explosionRadius() + ); var dmgPerk = PerkHelper.getPerkByType(tag, Perk.Type.DAMAGE); if (dmgPerk == ModPerks.MONSTER_HUNTER.get()) { @@ -205,7 +209,7 @@ public class RpgItem extends GunItem implements GeoItem, SpecialFireWeapon { rocket.setMonsterMultiplier(0.1f + 0.1f * perkLevel); } - float velocity = (float) GunsTool.getGunDoubleTag(tag, "Velocity"); + float velocity = (float) data.velocity(); if (PerkHelper.getPerkByType(tag, Perk.Type.AMMO) == ModPerks.MICRO_MISSILE.get()) { rocket.setNoGravity(true); @@ -213,7 +217,7 @@ public class RpgItem extends GunItem implements GeoItem, SpecialFireWeapon { int perkLevel = PerkHelper.getItemPerkLevel(ModPerks.MICRO_MISSILE.get(), tag); if (perkLevel > 0) { rocket.setExplosionRadius(0.5f); - rocket.setDamage((float) GunsTool.getGunDoubleTag(tag, "Damage") * (1.1f + perkLevel * 0.1f)); + rocket.setDamage((float) data.damage() * (1.1f + perkLevel * 0.1f)); velocity *= 1.2f; } } @@ -238,12 +242,13 @@ public class RpgItem extends GunItem implements GeoItem, SpecialFireWeapon { PacketDistributor.sendToPlayer(serverPlayer, new ShootClientMessage(10)); } - if (GunsTool.getGunIntTag(tag, "Ammo") == 1) { + if (data.getAmmo() == 1) { tag.putBoolean("empty", true); GunsTool.setGunBooleanTag(tag, "CloseHammer", true); } player.getCooldowns().addCooldown(stack.getItem(), 10); - GunsTool.setGunIntTag(tag, "Ammo", GunsTool.getGunIntTag(tag, "Ammo") - 1); + 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 4336e74b4..96331864b 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 @@ -8,6 +8,7 @@ import com.atsuishio.superbwarfare.entity.projectile.GunGrenadeEntity; import com.atsuishio.superbwarfare.event.ClientEventHandler; import com.atsuishio.superbwarfare.init.*; import com.atsuishio.superbwarfare.item.EnergyStorageItem; +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; @@ -88,7 +89,8 @@ public class SecondaryCataclysm extends GunItem implements GeoItem, SpecialFireW if (player == null) return PlayState.STOP; ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; - final var tag = NBTTool.getTag(stack); + var data = GunData.from(stack); + final var tag = data.getTag(); if (tag.getInt("reload_stage") == 1 && tag.getDouble("prepare_load") > 0) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.sc.prepare")); @@ -118,17 +120,18 @@ public class SecondaryCataclysm extends GunItem implements GeoItem, SpecialFireW if (player == null) return PlayState.STOP; ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; - final var tag = NBTTool.getTag(stack); + var data = GunData.from(stack); if (player.isSprinting() && player.onGround() && player.getPersistentData().getDouble("noRun") == 0 - && !(tag.getBoolean("is_empty_reloading")) - && tag.getInt("reload_stage") != 1 - && tag.getInt("reload_stage") != 2 - && tag.getInt("reload_stage") != 3 + && !data.emptyReloading() + && data.getTag().getInt("reload_stage") != 1 + && data.getTag().getInt("reload_stage") != 2 + && data.getTag().getInt("reload_stage") != 3 && ClientEventHandler.drawTime < 0.01 && ClientEventHandler.gunMelee == 0 - && !GunsTool.getGunBooleanTag(tag, "Reloading")) { + && !data.isReloading() + ) { if (player.hasEffect(MobEffects.MOVEMENT_SPEED)) { return event.setAndContinue(RawAnimation.begin().thenLoop("animation.sc.run_fast")); } else { @@ -269,12 +272,13 @@ public class SecondaryCataclysm extends GunItem implements GeoItem, SpecialFireW @Override public void fireOnPress(Player player, final CompoundTag tag) { ItemStack stack = player.getMainHandItem(); - if (GunsTool.getGunBooleanTag(tag, "Reloading")) return; - if (player.getCooldowns().isOnCooldown(stack.getItem()) || GunsTool.getGunIntTag(tag, "Ammo") <= 0) return; + var data = GunData.from(stack); + if (data.isReloading()) return; + if (player.getCooldowns().isOnCooldown(stack.getItem()) || data.getAmmo() <= 0) return; var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE); boolean zooming = cap != null && cap.zoom; - double spread = GunsTool.getGunDoubleTag(tag, "Spread"); + double spread = data.spread(); var stackCap = stack.getCapability(Capabilities.EnergyStorage.ITEM); var hasEnoughEnergy = stackCap != null && stackCap.getEnergyStored() >= 3000; @@ -283,9 +287,10 @@ public class SecondaryCataclysm extends GunItem implements GeoItem, SpecialFireW if (player.level() instanceof ServerLevel serverLevel) { GunGrenadeEntity gunGrenadeEntity = new GunGrenadeEntity(player, serverLevel, - (float) GunsTool.getGunDoubleTag(tag, "Damage"), - (float) GunsTool.getGunDoubleTag(tag, "ExplosionDamage"), - (float) GunsTool.getGunDoubleTag(tag, "ExplosionRadius")); + (float) data.damage(), + (float) data.explosionDamage(), + (float) data.explosionRadius() + ); var dmgPerk = PerkHelper.getPerkByType(tag, Perk.Type.DAMAGE); if (dmgPerk == ModPerks.MONSTER_HUNTER.get()) { @@ -296,11 +301,11 @@ public class SecondaryCataclysm extends GunItem implements GeoItem, SpecialFireW gunGrenadeEntity.setNoGravity(PerkHelper.getPerkByType(tag, Perk.Type.AMMO) == ModPerks.MICRO_MISSILE.get()); gunGrenadeEntity.charged(isChargedFire); - float velocity = (float) GunsTool.getGunDoubleTag(tag, "Velocity"); - int perkLevel = PerkHelper.getItemPerkLevel(ModPerks.MICRO_MISSILE.get(), tag); + float velocity = (float) data.velocity(); + int perkLevel = PerkHelper.getItemPerkLevel(ModPerks.MICRO_MISSILE.get(), data.getTag()); if (perkLevel > 0) { - gunGrenadeEntity.setExplosionRadius((float) GunsTool.getGunDoubleTag(tag, "ExplosionRadius") * 0.5f); - gunGrenadeEntity.setDamage((float) GunsTool.getGunDoubleTag(tag, "Damage") * (1.1f + perkLevel * 0.1f)); + gunGrenadeEntity.setExplosionRadius((float) data.explosionRadius() * 0.5f); + gunGrenadeEntity.setDamage((float) data.damage() * (1.1f + perkLevel * 0.1f)); velocity *= 1.2f; } @@ -337,7 +342,8 @@ public class SecondaryCataclysm extends GunItem implements GeoItem, SpecialFireW PacketDistributor.sendToPlayer(serverPlayer, new ShootClientMessage(10)); } - GunsTool.setGunIntTag(tag, "Ammo", GunsTool.getGunIntTag(tag, "Ammo") - 1); + data.setAmmo(data.getAmmo() - 1); + data.save(); player.getCooldowns().addCooldown(stack.getItem(), 6); } diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/machinegun/DevotionItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/machinegun/DevotionItem.java index ecbed46c5..a0166c5b1 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/machinegun/DevotionItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/machinegun/DevotionItem.java @@ -6,10 +6,10 @@ import com.atsuishio.superbwarfare.event.ClientEventHandler; 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.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,11 +50,11 @@ public class DevotionItem extends GunItem implements GeoItem { ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; - if (NBTTool.getTag(stack).getBoolean("is_empty_reloading")) { + if (GunData.from(stack).emptyReloading()) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.devotion.reload_empty")); } - if (NBTTool.getTag(stack).getBoolean("is_normal_reloading")) { + if (GunData.from(stack).normalReloading()) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.devotion.reload_normal")); } 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 b984864c4..22bd597f3 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 @@ -6,6 +6,7 @@ import com.atsuishio.superbwarfare.event.ClientEventHandler; 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.perk.Perk; import com.atsuishio.superbwarfare.perk.PerkHelper; @@ -67,11 +68,11 @@ public class M60Item extends GunItem implements GeoItem { ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; - if (NBTTool.getTag(stack).getBoolean("is_empty_reloading")) { + if (GunData.from(stack).emptyReloading()) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m60.reload")); } - if (NBTTool.getTag(stack).getBoolean("is_normal_reloading")) { + if (GunData.from(stack).normalReloading()) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m60.reload2")); } diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/machinegun/MinigunItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/machinegun/MinigunItem.java index 67a82ac3c..c9005cc77 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/machinegun/MinigunItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/machinegun/MinigunItem.java @@ -7,6 +7,7 @@ import com.atsuishio.superbwarfare.init.ModParticleTypes; import com.atsuishio.superbwarfare.init.ModPerks; import com.atsuishio.superbwarfare.init.ModRarity; import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.GunData; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.perk.Perk; import com.atsuishio.superbwarfare.tools.NBTTool; @@ -34,6 +35,10 @@ import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.ParametersAreNonnullByDefault; public class MinigunItem extends GunItem implements GeoItem { + @Override + public int getCustomRPM(ItemStack stack) { + return GunData.from(stack).getData().getInt("CustomRPM"); + } private static final String TAG_HEAT = "heat"; private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/machinegun/RpkItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/machinegun/RpkItem.java index 762d95580..08986a654 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/machinegun/RpkItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/machinegun/RpkItem.java @@ -6,10 +6,10 @@ import com.atsuishio.superbwarfare.event.ClientEventHandler; 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.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,11 +50,11 @@ public class RpkItem extends GunItem implements GeoItem { ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; - if (NBTTool.getTag(stack).getBoolean("is_empty_reloading")) { + if (GunData.from(stack).emptyReloading()) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.ak47.reload_empty")); } - if (NBTTool.getTag(stack).getBoolean("is_normal_reloading")) { + if (GunData.from(stack).normalReloading()) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.ak47.reload_normal")); } diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/AK12Item.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/AK12Item.java index ed93ffa6f..3fcbfea5c 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/AK12Item.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/AK12Item.java @@ -6,6 +6,7 @@ import com.atsuishio.superbwarfare.client.renderer.item.AK12ItemRenderer; import com.atsuishio.superbwarfare.event.ClientEventHandler; 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.perk.Perk; import com.atsuishio.superbwarfare.perk.PerkHelper; @@ -16,18 +17,15 @@ import net.minecraft.client.player.LocalPlayer; import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvent; import net.minecraft.world.effect.MobEffects; -import net.minecraft.world.entity.Entity; 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 software.bernie.geckolib.animatable.GeoItem; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animation.*; import software.bernie.geckolib.renderer.GeoItemRenderer; import software.bernie.geckolib.util.GeckoLibUtil; -import javax.annotation.ParametersAreNonnullByDefault; import java.util.Set; public class AK12Item extends GunItem implements GeoItem { @@ -58,12 +56,13 @@ public class AK12Item extends GunItem implements GeoItem { if (player == null) return PlayState.STOP; ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; - final var tag = NBTTool.getTag(stack); + var data = GunData.from(stack); + final var tag = data.getTag(); boolean drum = GunsTool.getAttachmentType(tag, GunsTool.AttachmentType.MAGAZINE) == 2; boolean grip = GunsTool.getAttachmentType(tag, GunsTool.AttachmentType.GRIP) == 1 || GunsTool.getAttachmentType(tag, GunsTool.AttachmentType.GRIP) == 2; - if (NBTTool.getTag(stack).getBoolean("is_empty_reloading")) { + if (GunData.from(stack).emptyReloading()) { if (grip) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.ak12.reload_empty_grip")); } else { @@ -71,7 +70,7 @@ public class AK12Item extends GunItem implements GeoItem { } } - if (NBTTool.getTag(stack).getBoolean("is_normal_reloading")) { + if (GunData.from(stack).normalReloading()) { if (drum) { if (grip) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.ak12.reload_normal_drum_grip")); @@ -134,33 +133,28 @@ public class AK12Item extends GunItem implements GeoItem { } @Override - @ParametersAreNonnullByDefault - public void inventoryTick(ItemStack stack, Level world, Entity entity, int slot, boolean selected) { - super.inventoryTick(stack, world, entity, slot, selected); - final var tag = NBTTool.getTag(stack); + public boolean canAdjustZoom(ItemStack stack) { + return GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.SCOPE) == 3; + } - int scopeType = GunsTool.getAttachmentType(tag, GunsTool.AttachmentType.SCOPE); - int barrelType = GunsTool.getAttachmentType(tag, GunsTool.AttachmentType.BARREL); - int magType = GunsTool.getAttachmentType(tag, GunsTool.AttachmentType.MAGAZINE); - int stockType = GunsTool.getAttachmentType(tag, GunsTool.AttachmentType.STOCK); + @Override + public double getCustomZoom(ItemStack stack) { + int scopeType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.SCOPE); + return switch (scopeType) { + case 0, 1 -> 0; + case 2 -> 2.15; + default -> GunsTool.getGunDoubleTag(NBTTool.getTag(stack), "CustomZoom"); + }; + } - int customMag = switch (magType) { + @Override + public int getCustomMagazine(ItemStack stack) { + int magType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.MAGAZINE); + return switch (magType) { case 1 -> 15; case 2 -> 45; default -> 0; }; - - double customZoom = switch (scopeType) { - case 0, 1 -> 0; - case 2 -> 2.15; - default -> GunsTool.getGunDoubleTag(tag, "CustomZoom"); - }; - - tag.putBoolean("CanAdjustZoomFov", scopeType == 3); - GunsTool.setGunDoubleTag(tag, "CustomZoom", customZoom); - GunsTool.setGunIntTag(tag, "CustomMagazine", customMag); - - NBTTool.saveTag(stack, tag); } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/AK47Item.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/AK47Item.java index 1d52dbe30..40bcd4dd4 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/AK47Item.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/AK47Item.java @@ -6,6 +6,7 @@ import com.atsuishio.superbwarfare.client.renderer.item.AK47ItemRenderer; import com.atsuishio.superbwarfare.event.ClientEventHandler; 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.perk.Perk; import com.atsuishio.superbwarfare.perk.PerkHelper; @@ -16,18 +17,15 @@ import net.minecraft.client.player.LocalPlayer; import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvent; import net.minecraft.world.effect.MobEffects; -import net.minecraft.world.entity.Entity; 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 software.bernie.geckolib.animatable.GeoItem; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animation.*; import software.bernie.geckolib.renderer.GeoItemRenderer; import software.bernie.geckolib.util.GeckoLibUtil; -import javax.annotation.ParametersAreNonnullByDefault; import java.util.Set; public class AK47Item extends GunItem implements GeoItem { @@ -58,12 +56,13 @@ public class AK47Item extends GunItem implements GeoItem { if (player == null) return PlayState.STOP; ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; - final var tag = NBTTool.getTag(stack); + var data = GunData.from(stack); + final var tag = data.getTag(); boolean drum = GunsTool.getAttachmentType(tag, GunsTool.AttachmentType.MAGAZINE) == 2; boolean grip = GunsTool.getAttachmentType(tag, GunsTool.AttachmentType.GRIP) == 1 || GunsTool.getAttachmentType(tag, GunsTool.AttachmentType.GRIP) == 2; - if (NBTTool.getTag(stack).getBoolean("is_empty_reloading")) { + if (GunData.from(stack).emptyReloading()) { if (drum) { if (grip) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.ak47.reload_empty_drum_grip")); @@ -79,7 +78,7 @@ public class AK47Item extends GunItem implements GeoItem { } } - if (NBTTool.getTag(stack).getBoolean("is_normal_reloading")) { + if (GunData.from(stack).normalReloading()) { if (drum) { if (grip) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.ak47.reload_normal_drum_grip")); @@ -142,32 +141,28 @@ public class AK47Item extends GunItem implements GeoItem { } @Override - @ParametersAreNonnullByDefault - public void inventoryTick(ItemStack stack, Level world, Entity entity, int slot, boolean selected) { - super.inventoryTick(stack, world, entity, slot, selected); - - final var tag = NBTTool.getTag(stack); - int scopeType = GunsTool.getAttachmentType(tag, GunsTool.AttachmentType.SCOPE); - int barrelType = GunsTool.getAttachmentType(tag, GunsTool.AttachmentType.BARREL); - int magType = GunsTool.getAttachmentType(tag, GunsTool.AttachmentType.MAGAZINE); - int stockType = GunsTool.getAttachmentType(tag, GunsTool.AttachmentType.STOCK); - - int customMag = switch (magType) { + public int getCustomMagazine(ItemStack stack) { + int magType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.MAGAZINE); + return switch (magType) { case 1 -> 15; case 2 -> 40; default -> 0; }; + } - double customZoom = switch (scopeType) { + @Override + public double getCustomZoom(ItemStack stack) { + int scopeType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.SCOPE); + return switch (scopeType) { case 0, 1 -> 0; case 2 -> 2.75; - default -> GunsTool.getGunDoubleTag(tag, "CustomZoom"); + default -> GunsTool.getGunDoubleTag(NBTTool.getTag(stack), "CustomZoom"); }; + } - tag.putBoolean("CanAdjustZoomFov", scopeType == 3); - GunsTool.setGunDoubleTag(tag, "CustomZoom", customZoom); - GunsTool.setGunIntTag(tag, "CustomMagazine", customMag); - NBTTool.saveTag(stack, tag); + @Override + public boolean canAdjustZoom(ItemStack stack) { + return GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.SCOPE) == 3; } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/Hk416Item.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/Hk416Item.java index 2362e1ce2..6bd01f9ff 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/Hk416Item.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/Hk416Item.java @@ -6,6 +6,7 @@ import com.atsuishio.superbwarfare.client.renderer.item.Hk416ItemRenderer; import com.atsuishio.superbwarfare.event.ClientEventHandler; 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.perk.Perk; import com.atsuishio.superbwarfare.perk.PerkHelper; @@ -16,11 +17,9 @@ import net.minecraft.client.player.LocalPlayer; import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvent; import net.minecraft.world.effect.MobEffects; -import net.minecraft.world.entity.Entity; 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 software.bernie.geckolib.animatable.GeoItem; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animation.*; @@ -52,12 +51,13 @@ public class Hk416Item extends GunItem implements GeoItem { if (player == null) return PlayState.STOP; ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; - final var tag = NBTTool.getTag(stack); + var data = GunData.from(stack); + final var tag = data.getTag(); boolean drum = GunsTool.getAttachmentType(tag, GunsTool.AttachmentType.MAGAZINE) == 2; boolean grip = GunsTool.getAttachmentType(tag, GunsTool.AttachmentType.GRIP) == 1 || GunsTool.getAttachmentType(tag, GunsTool.AttachmentType.GRIP) == 2; - if (NBTTool.getTag(stack).getBoolean("is_empty_reloading")) { + if (GunData.from(stack).emptyReloading()) { if (drum) { if (grip) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m4.reload_empty_drum_grip")); @@ -73,7 +73,7 @@ public class Hk416Item extends GunItem implements GeoItem { } } - if (NBTTool.getTag(stack).getBoolean("is_normal_reloading")) { + if (GunData.from(stack).normalReloading()) { if (drum) { if (grip) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m4.reload_normal_drum_grip")); @@ -131,31 +131,28 @@ public class Hk416Item extends GunItem implements GeoItem { } @Override - public void inventoryTick(ItemStack stack, Level world, Entity entity, int slot, boolean selected) { - super.inventoryTick(stack, world, entity, slot, selected); - - final var tag = NBTTool.getTag(stack); - int scopeType = GunsTool.getAttachmentType(tag, GunsTool.AttachmentType.SCOPE); - int barrelType = GunsTool.getAttachmentType(tag, GunsTool.AttachmentType.BARREL); - int magType = GunsTool.getAttachmentType(tag, GunsTool.AttachmentType.MAGAZINE); - int stockType = GunsTool.getAttachmentType(tag, GunsTool.AttachmentType.STOCK); - - int customMag = switch (magType) { + public int getCustomMagazine(ItemStack stack) { + int magType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.MAGAZINE); + return switch (magType) { case 1 -> 15; case 2 -> 30; default -> 0; }; + } - double customZoom = switch (scopeType) { + @Override + public double getCustomZoom(ItemStack stack) { + int scopeType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.SCOPE); + return switch (scopeType) { case 0, 1 -> 0; case 2 -> 2.25; - default -> GunsTool.getGunDoubleTag(tag, "CustomZoom"); + default -> GunsTool.getGunDoubleTag(NBTTool.getTag(stack), "CustomZoom"); }; + } - tag.putBoolean("CanAdjustZoomFov", scopeType == 3); - GunsTool.setGunDoubleTag(tag, "CustomZoom", customZoom); - GunsTool.setGunIntTag(tag, "CustomMagazine", customMag); - NBTTool.saveTag(stack, tag); + @Override + public boolean canAdjustZoom(ItemStack stack) { + return GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.SCOPE) == 3; } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/InsidiousItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/InsidiousItem.java index fd5d4272b..50eaa772c 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/InsidiousItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/InsidiousItem.java @@ -5,10 +5,10 @@ import com.atsuishio.superbwarfare.client.renderer.item.InsidiousItemRenderer; import com.atsuishio.superbwarfare.event.ClientEventHandler; 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.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; @@ -49,9 +49,9 @@ public class InsidiousItem extends GunItem implements GeoItem { if (player == null) return PlayState.STOP; ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + var data = GunData.from(stack); - var tag = NBTTool.getTag(stack); - if (tag.getBoolean("is_empty_reloading")) { + if (data.emptyReloading()) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.insidious.reload")); } diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/M4Item.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/M4Item.java index 0d3560d7f..4a8a8ee4c 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/M4Item.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/M4Item.java @@ -6,6 +6,7 @@ import com.atsuishio.superbwarfare.client.renderer.item.M4ItemRenderer; import com.atsuishio.superbwarfare.event.ClientEventHandler; 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.perk.Perk; import com.atsuishio.superbwarfare.perk.PerkHelper; @@ -16,18 +17,15 @@ import net.minecraft.client.player.LocalPlayer; import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvent; import net.minecraft.world.effect.MobEffects; -import net.minecraft.world.entity.Entity; 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 software.bernie.geckolib.animatable.GeoItem; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animation.*; import software.bernie.geckolib.renderer.GeoItemRenderer; import software.bernie.geckolib.util.GeckoLibUtil; -import javax.annotation.ParametersAreNonnullByDefault; import java.util.Set; public class M4Item extends GunItem implements GeoItem { @@ -51,14 +49,16 @@ public class M4Item extends GunItem implements GeoItem { private PlayState idlePredicate(AnimationState event) { LocalPlayer player = Minecraft.getInstance().player; if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; - final var tag = NBTTool.getTag(stack); + var data = GunData.from(stack); + final var tag = data.getTag(); boolean drum = GunsTool.getAttachmentType(tag, GunsTool.AttachmentType.MAGAZINE) == 2; boolean grip = GunsTool.getAttachmentType(tag, GunsTool.AttachmentType.GRIP) == 1 || GunsTool.getAttachmentType(tag, GunsTool.AttachmentType.GRIP) == 2; - if (NBTTool.getTag(stack).getBoolean("is_empty_reloading")) { + if (data.emptyReloading()) { if (drum) { if (grip) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m4.reload_empty_drum_grip")); @@ -74,7 +74,7 @@ public class M4Item extends GunItem implements GeoItem { } } - if (NBTTool.getTag(stack).getBoolean("is_normal_reloading")) { + if (data.normalReloading()) { if (drum) { if (grip) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m4.reload_normal_drum_grip")); @@ -142,33 +142,33 @@ public class M4Item extends GunItem implements GeoItem { } @Override - @ParametersAreNonnullByDefault - public void inventoryTick(ItemStack stack, Level world, Entity entity, int slot, boolean selected) { - super.inventoryTick(stack, world, entity, slot, selected); + public boolean canSwitchScope(ItemStack stack) { + return GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.SCOPE) == 2; + } - final var tag = NBTTool.getTag(stack); - int scopeType = GunsTool.getAttachmentType(tag, GunsTool.AttachmentType.SCOPE); - int barrelType = GunsTool.getAttachmentType(tag, GunsTool.AttachmentType.BARREL); - int magType = GunsTool.getAttachmentType(tag, GunsTool.AttachmentType.MAGAZINE); - int stockType = GunsTool.getAttachmentType(tag, GunsTool.AttachmentType.STOCK); - - int customMag = switch (magType) { + @Override + public int getCustomMagazine(ItemStack stack) { + int magType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.MAGAZINE); + return switch (magType) { case 1 -> 15; case 2 -> 30; default -> 0; }; + } - double customZoom = switch (scopeType) { + @Override + public double getCustomZoom(ItemStack stack) { + int scopeType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.SCOPE); + return switch (scopeType) { case 0, 1 -> 0; case 2 -> NBTTool.getTag(stack).getBoolean("ScopeAlt") ? 0 : 2.75; - default -> GunsTool.getGunDoubleTag(tag, "CustomZoom"); + default -> GunsTool.getGunDoubleTag(NBTTool.getTag(stack), "CustomZoom"); }; + } - GunsTool.setGunBooleanTag(tag, "CanSwitchScope", scopeType == 2); - tag.putBoolean("CanAdjustZoomFov", scopeType == 3); - GunsTool.setGunDoubleTag(tag, "CustomZoom", customZoom); - GunsTool.setGunIntTag(tag, "CustomMagazine", customMag); - NBTTool.saveTag(stack, tag); + @Override + public boolean canAdjustZoom(ItemStack stack) { + return GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.SCOPE) == 3; } @Override 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 609a41d27..bf3f2cd17 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 @@ -5,11 +5,11 @@ import com.atsuishio.superbwarfare.client.renderer.item.MarlinItemRenderer; import com.atsuishio.superbwarfare.event.ClientEventHandler; 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.perk.Perk; import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.tools.GunsTool; -import com.atsuishio.superbwarfare.tools.NBTTool; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; import net.minecraft.resources.ResourceLocation; @@ -49,7 +49,8 @@ public class MarlinItem extends GunItem implements GeoItem { if (player == null) return PlayState.STOP; ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; - final var tag = NBTTool.getTag(stack); + var data = GunData.from(stack); + final var tag = data.getTag(); if (GunsTool.getGunIntTag(tag, "BoltActionTick") > 0) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.marlin.shift")); @@ -79,14 +80,14 @@ public class MarlinItem extends GunItem implements GeoItem { if (player == null) return PlayState.STOP; ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; - final var tag = NBTTool.getTag(stack); + var data = GunData.from(stack); if (transformType != null && transformType.firstPerson()) { if (player.isSprinting() && player.onGround() && player.getPersistentData().getDouble("noRun") == 0 && ClientEventHandler.drawTime < 0.01 - && !GunsTool.getGunBooleanTag(tag, "Reloading")) { + && !data.isReloading()) { if (player.hasEffect(MobEffects.MOVEMENT_SPEED)) { return event.setAndContinue(RawAnimation.begin().thenLoop("animation.marlin.run_fast")); } else { 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 906d995be..041466210 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 @@ -6,6 +6,7 @@ import com.atsuishio.superbwarfare.client.renderer.item.Mk14ItemRenderer; import com.atsuishio.superbwarfare.event.ClientEventHandler; 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.perk.Perk; import com.atsuishio.superbwarfare.perk.PerkHelper; @@ -16,18 +17,15 @@ import net.minecraft.client.player.LocalPlayer; import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvent; import net.minecraft.world.effect.MobEffects; -import net.minecraft.world.entity.Entity; 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 software.bernie.geckolib.animatable.GeoItem; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animation.*; import software.bernie.geckolib.renderer.GeoItemRenderer; import software.bernie.geckolib.util.GeckoLibUtil; -import javax.annotation.ParametersAreNonnullByDefault; import java.util.Set; public class Mk14Item extends GunItem implements GeoItem { @@ -53,12 +51,13 @@ public class Mk14Item extends GunItem implements GeoItem { if (player == null) return PlayState.STOP; ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; - final var tag = NBTTool.getTag(stack); + var data = GunData.from(stack); + final var tag = data.getTag(); boolean drum = GunsTool.getAttachmentType(tag, GunsTool.AttachmentType.MAGAZINE) == 2; boolean grip = GunsTool.getAttachmentType(tag, GunsTool.AttachmentType.GRIP) == 1 || GunsTool.getAttachmentType(tag, GunsTool.AttachmentType.GRIP) == 2; - if (tag.getBoolean("is_empty_reloading")) { + if (data.emptyReloading()) { if (drum) { if (grip) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m14.reload_empty_drum_grip")); @@ -74,7 +73,7 @@ public class Mk14Item extends GunItem implements GeoItem { } } - if (tag.getBoolean("is_normal_reloading")) { + if (data.normalReloading()) { if (drum) { if (grip) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m14.reload_normal_drum_grip")); @@ -137,30 +136,28 @@ public class Mk14Item extends GunItem implements GeoItem { } @Override - @ParametersAreNonnullByDefault - public void inventoryTick(ItemStack stack, Level world, Entity entity, int slot, boolean selected) { - super.inventoryTick(stack, world, entity, slot, selected); - - final var tag = NBTTool.getTag(stack); - int scopeType = GunsTool.getAttachmentType(tag, GunsTool.AttachmentType.SCOPE); - int magType = GunsTool.getAttachmentType(tag, GunsTool.AttachmentType.MAGAZINE); - - int customMag = switch (magType) { + public int getCustomMagazine(ItemStack stack) { + int magType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.MAGAZINE); + return switch (magType) { case 1 -> 10; case 2 -> 30; default -> 0; }; + } - double customZoom = switch (scopeType) { + @Override + public double getCustomZoom(ItemStack stack) { + int scopeType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.SCOPE); + return switch (scopeType) { case 0, 1 -> 0; case 2 -> 2.25; - default -> GunsTool.getGunDoubleTag(tag, "CustomZoom"); + default -> GunsTool.getGunDoubleTag(NBTTool.getTag(stack), "CustomZoom"); }; + } - tag.putBoolean("CanAdjustZoomFov", scopeType == 3); - GunsTool.setGunDoubleTag(tag, "CustomZoom", customZoom); - GunsTool.setGunIntTag(tag, "CustomMagazine", customMag); - NBTTool.saveTag(stack, tag); + @Override + public boolean canAdjustZoom(ItemStack stack) { + return GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.SCOPE) == 3; } @Override 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 edf9681f2..d6743dbe2 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 @@ -6,6 +6,7 @@ import com.atsuishio.superbwarfare.client.renderer.item.Qbz95ItemRenderer; import com.atsuishio.superbwarfare.event.ClientEventHandler; 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.perk.Perk; import com.atsuishio.superbwarfare.perk.PerkHelper; @@ -54,12 +55,13 @@ public class Qbz95Item extends GunItem implements GeoItem { if (player == null) return PlayState.STOP; ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; - final var tag = NBTTool.getTag(stack); + var data = GunData.from(stack); + final var tag = data.getTag(); boolean drum = GunsTool.getAttachmentType(tag, GunsTool.AttachmentType.MAGAZINE) == 2; boolean grip = GunsTool.getAttachmentType(tag, GunsTool.AttachmentType.GRIP) == 1 || GunsTool.getAttachmentType(tag, GunsTool.AttachmentType.GRIP) == 2; - if (tag.getBoolean("is_empty_reloading")) { + if (data.emptyReloading()) { if (drum) { if (grip) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.qbz95.reload_empty_drum_grip")); @@ -75,7 +77,7 @@ public class Qbz95Item extends GunItem implements GeoItem { } } - if (tag.getBoolean("is_normal_reloading")) { + if (data.normalReloading()) { if (drum) { if (grip) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.qbz95.reload_normal_drum_grip")); @@ -142,27 +144,32 @@ public class Qbz95Item extends GunItem implements GeoItem { public void inventoryTick(ItemStack stack, Level world, Entity entity, int slot, boolean selected) { super.inventoryTick(stack, world, entity, slot, selected); - final var rootTag = NBTTool.getTag(stack); - int scopeType = GunsTool.getAttachmentType(rootTag, GunsTool.AttachmentType.SCOPE); - int magType = GunsTool.getAttachmentType(rootTag, GunsTool.AttachmentType.MAGAZINE); - + int magType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.MAGAZINE); if (magType == 1) { - CompoundTag tag = rootTag.getCompound("Attachments"); + CompoundTag tag = NBTTool.getTag(stack).getCompound("Attachments"); tag.putInt("Magazine", 2); } + } - int customMag = magType == 2 ? 30 : 0; + @Override + public int getCustomMagazine(ItemStack stack) { + int magType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.MAGAZINE); + return magType == 2 ? 30 : 0; + } - double customZoom = switch (scopeType) { + @Override + public double getCustomZoom(ItemStack stack) { + int scopeType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.SCOPE); + return switch (scopeType) { case 0, 1 -> 0; case 2 -> 2.15; - default -> GunsTool.getGunDoubleTag(rootTag, "CustomZoom"); + default -> GunsTool.getGunDoubleTag(NBTTool.getTag(stack), "CustomZoom"); }; + } - rootTag.putBoolean("CanAdjustZoomFov", scopeType == 3); - GunsTool.setGunDoubleTag(rootTag, "CustomZoom", customZoom); - GunsTool.setGunIntTag(rootTag, "CustomMagazine", customMag); - NBTTool.saveTag(stack, rootTag); + @Override + public boolean canAdjustZoom(ItemStack stack) { + return GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.SCOPE) == 3; } @Override 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 9cd4e66b3..53bb501a0 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 @@ -5,6 +5,7 @@ import com.atsuishio.superbwarfare.client.renderer.item.SksItemRenderer; import com.atsuishio.superbwarfare.event.ClientEventHandler; 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.perk.Perk; import com.atsuishio.superbwarfare.perk.PerkHelper; @@ -58,11 +59,11 @@ public class SksItem extends GunItem implements GeoItem { ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; - if (NBTTool.getTag(stack).getBoolean("is_empty_reloading")) { + if (GunData.from(stack).emptyReloading()) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.sks.reload_empty")); } - if (NBTTool.getTag(stack).getBoolean("is_normal_reloading")) { + if (GunData.from(stack).normalReloading()) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.sks.reload_normal")); } diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/shotgun/Aa12Item.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/shotgun/Aa12Item.java index bd9253276..d6516303d 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/shotgun/Aa12Item.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/shotgun/Aa12Item.java @@ -8,10 +8,10 @@ import com.atsuishio.superbwarfare.init.ModPerks; import com.atsuishio.superbwarfare.init.ModRarity; 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.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; @@ -57,11 +57,11 @@ public class Aa12Item extends GunItem implements GeoItem { if (this.animationProcedure.equals("empty")) { - if (NBTTool.getTag(stack).getBoolean("is_empty_reloading")) { + if (GunData.from(stack).emptyReloading()) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.aa12.reload_empty")); } - if (NBTTool.getTag(stack).getBoolean("is_normal_reloading")) { + if (GunData.from(stack).normalReloading()) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.aa12.reload_normal")); } diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/shotgun/HomemadeShotgunItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/shotgun/HomemadeShotgunItem.java index 4fae83bd3..e076f6030 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/shotgun/HomemadeShotgunItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/shotgun/HomemadeShotgunItem.java @@ -6,10 +6,10 @@ import com.atsuishio.superbwarfare.client.tooltip.component.ShotgunImageComponen import com.atsuishio.superbwarfare.event.ClientEventHandler; 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.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; @@ -58,11 +58,11 @@ public class HomemadeShotgunItem extends GunItem implements GeoItem { ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; - if (NBTTool.getTag(stack).getBoolean("is_empty_reloading")) { + if (GunData.from(stack).emptyReloading()) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.ab.reload_empty")); } - if (NBTTool.getTag(stack).getBoolean("is_normal_reloading")) { + if (GunData.from(stack).normalReloading()) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.ab.reload_normal")); } 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 55cb758a5..ae52bd473 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 @@ -6,6 +6,7 @@ import com.atsuishio.superbwarfare.client.tooltip.component.ShotgunImageComponen import com.atsuishio.superbwarfare.event.ClientEventHandler; 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.perk.Perk; import com.atsuishio.superbwarfare.perk.PerkHelper; @@ -53,29 +54,30 @@ public class M870Item extends GunItem implements GeoItem { if (player == null) return PlayState.STOP; 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 (GunsTool.getGunIntTag(tag, "BoltActionTick") > 0) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m870.shift")); } - if (tag.getInt("reload_stage") == 1 && tag.getDouble("prepare_load") > 0) { + if (data.getReloadStage() == 1 && tag.getDouble("prepare_load") > 0) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m870.preparealt")); } - if (tag.getInt("reload_stage") == 1 && tag.getDouble("prepare") > 0) { + if (data.getReloadStage() == 1 && tag.getDouble("prepare") > 0) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m870.prepare")); } - if (tag.getDouble("load_index") == 0 && tag.getInt("reload_stage") == 2) { + if (tag.getDouble("load_index") == 0 && data.getReloadStage() == 2) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m870.iterativeload")); } - if (tag.getDouble("load_index") == 1 && tag.getInt("reload_stage") == 2) { + if (tag.getDouble("load_index") == 1 && data.getReloadStage() == 2) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m870.iterativeload2")); } - if (tag.getInt("reload_stage") == 3) { + if (data.getReloadStage() == 3) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m870.finish")); } @@ -85,15 +87,16 @@ public class M870Item extends GunItem implements GeoItem { private PlayState idlePredicate(AnimationState event) { LocalPlayer player = Minecraft.getInstance().player; if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; - final var tag = NBTTool.getTag(stack); + var data = GunData.from(stack); if (player.isSprinting() && player.onGround() && player.getPersistentData().getDouble("noRun") == 0 && ClientEventHandler.drawTime < 0.01 - && !GunsTool.getGunBooleanTag(tag, "Reloading")) { + && !data.isReloading()) { if (player.hasEffect(MobEffects.MOVEMENT_SPEED)) { return event.setAndContinue(RawAnimation.begin().thenLoop("animation.m870.run_fast")); } else { diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/smg/VectorItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/smg/VectorItem.java index d3e4bd964..ef7f67a39 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/smg/VectorItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/smg/VectorItem.java @@ -6,6 +6,7 @@ import com.atsuishio.superbwarfare.client.renderer.item.VectorItemRenderer; import com.atsuishio.superbwarfare.event.ClientEventHandler; 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.perk.Perk; import com.atsuishio.superbwarfare.perk.PerkHelper; @@ -50,11 +51,12 @@ public class VectorItem extends GunItem implements GeoItem { if (player == null) return PlayState.STOP; ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; - final var tag = NBTTool.getTag(stack); + var data = GunData.from(stack); + final var tag = data.getTag(); boolean drum = GunsTool.getAttachmentType(tag, GunsTool.AttachmentType.MAGAZINE) == 2; - if (tag.getBoolean("is_empty_reloading")) { + if (data.emptyReloading()) { if (drum) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.vec.reload_empty_drum")); } else { @@ -62,7 +64,7 @@ public class VectorItem extends GunItem implements GeoItem { } } - if (tag.getBoolean("is_normal_reloading")) { + if (data.normalReloading()) { if (drum) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.vec.reload_normal_drum")); } else { @@ -118,30 +120,29 @@ public class VectorItem extends GunItem implements GeoItem { public void inventoryTick(ItemStack stack, Level world, Entity entity, int slot, boolean selected) { super.inventoryTick(stack, world, entity, slot, selected); - final var tag = NBTTool.getTag(stack); - int scopeType = GunsTool.getAttachmentType(tag, GunsTool.AttachmentType.SCOPE); - int magType = GunsTool.getAttachmentType(tag, GunsTool.AttachmentType.MAGAZINE); + int scopeType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.SCOPE); - int customMag = switch (magType) { + if (scopeType == 3) { + CompoundTag tag = NBTTool.getTag(stack).getCompound("Attachments"); + tag.putInt("Scope", 0); + } + } + + @Override + public double getCustomZoom(ItemStack stack) { + int scopeType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.SCOPE); + if (scopeType == 2) return 0.75; + return GunsTool.getGunDoubleTag(NBTTool.getTag(stack), "CustomZoom"); + } + + @Override + public int getCustomMagazine(ItemStack stack) { + int magType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.MAGAZINE); + return switch (magType) { case 1 -> 20; case 2 -> 57; default -> 0; }; - - if (scopeType == 3) { - CompoundTag attachments = tag.getCompound("Attachments"); - attachments.putInt("Scope", 0); - } - - double customZoom = switch (scopeType) { - case 0, 1 -> 0; - case 2 -> 0.75; - default -> GunsTool.getGunDoubleTag(tag, "CustomZoom"); - }; - - GunsTool.setGunDoubleTag(tag, "CustomZoom", customZoom); - GunsTool.setGunDoubleTag(tag, "CustomMagazine", customMag); - NBTTool.saveTag(stack, tag); } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/HuntingRifleItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/HuntingRifleItem.java index 5121d27af..91c7df17a 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/HuntingRifleItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/HuntingRifleItem.java @@ -5,10 +5,10 @@ import com.atsuishio.superbwarfare.client.renderer.item.HuntingRifleItemRenderer import com.atsuishio.superbwarfare.event.ClientEventHandler; 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.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,7 +54,7 @@ public class HuntingRifleItem extends GunItem implements GeoItem { ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; - if (NBTTool.getTag(stack).getBoolean("is_empty_reloading")) { + if (GunData.from(stack).emptyReloading()) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.hunting_rifle.reload")); } 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 7c254f130..545d06778 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 @@ -5,11 +5,11 @@ import com.atsuishio.superbwarfare.client.renderer.item.K98ItemRenderer; import com.atsuishio.superbwarfare.event.ClientEventHandler; 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.perk.Perk; import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.tools.GunsTool; -import com.atsuishio.superbwarfare.tools.NBTTool; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; import net.minecraft.resources.ResourceLocation; @@ -47,31 +47,33 @@ public class K98Item extends GunItem implements GeoItem { private PlayState fireAnimPredicate(AnimationState event) { LocalPlayer player = Minecraft.getInstance().player; if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; - final var tag = NBTTool.getTag(stack); + var data = GunData.from(stack); + final var tag = data.getTag(); if (GunsTool.getGunIntTag(tag, "BoltActionTick") > 0) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.k98.shift")); } - if (tag.getBoolean("is_empty_reloading")) { + if (data.getReloadState() == GunData.ReloadState.EMPTY_RELOADING) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.k98.reload_empty")); } - if (tag.getInt("reload_stage") == 1 && tag.getDouble("prepare") > 0) { + if (data.getReloadStage() == 1 && tag.getDouble("prepare") > 0) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.k98.prepare")); } - if (tag.getDouble("load_index") == 0 && tag.getInt("reload_stage") == 2) { + if (tag.getDouble("load_index") == 0 && data.getReloadStage() == 2) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.k98.iterativeload")); } - if (tag.getDouble("load_index") == 1 && tag.getInt("reload_stage") == 2) { + if (tag.getDouble("load_index") == 1 && data.getReloadStage() == 2) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.k98.iterativeload2")); } - if (tag.getInt("reload_stage") == 3) { + if (data.getReloadStage() == 3) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.k98.finish")); } @@ -81,18 +83,21 @@ public class K98Item extends GunItem implements GeoItem { private PlayState idlePredicate(AnimationState event) { LocalPlayer player = Minecraft.getInstance().player; if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; - final var tag = NBTTool.getTag(stack); + var data = GunData.from(stack); + final var tag = data.getTag(); if (player.isSprinting() && player.onGround() && player.getPersistentData().getDouble("noRun") == 0 - && !(tag.getBoolean("is_empty_reloading")) - && tag.getInt("reload_stage") != 1 - && tag.getInt("reload_stage") != 2 - && tag.getInt("reload_stage") != 3 + && !(data.getReloadState() == GunData.ReloadState.EMPTY_RELOADING) + && data.getReloadStage() != 1 + && data.getReloadStage() != 2 + && data.getReloadStage() != 3 && ClientEventHandler.drawTime < 0.01 - && !GunsTool.getGunBooleanTag(tag, "Reloading")) { + && !data.isReloading() + ) { if (player.hasEffect(MobEffects.MOVEMENT_SPEED) && GunsTool.getGunIntTag(tag, "BoltActionTick") == 0) { return event.setAndContinue(RawAnimation.begin().thenLoop("animation.k98.run_fast")); } else { diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/M98bItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/M98bItem.java index 42a7d5e30..dba27ab9c 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/M98bItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/M98bItem.java @@ -5,11 +5,11 @@ import com.atsuishio.superbwarfare.client.renderer.item.M98bItemRenderer; import com.atsuishio.superbwarfare.event.ClientEventHandler; 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.perk.Perk; import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.tools.GunsTool; -import com.atsuishio.superbwarfare.tools.NBTTool; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; import net.minecraft.resources.ResourceLocation; @@ -49,17 +49,18 @@ public class M98bItem extends GunItem implements GeoItem { if (player == null) return PlayState.STOP; ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; - final var tag = NBTTool.getTag(stack); + var data = GunData.from(stack); + final var tag = data.getTag(); if (GunsTool.getGunIntTag(tag, "BoltActionTick") > 0) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m98b.shift")); } - if (tag.getBoolean("is_empty_reloading")) { + if (data.emptyReloading()) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m98b.reload_empty")); } - if (tag.getBoolean("is_normal_reloading")) { + if (data.normalReloading()) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m98b.reload_normal")); } @@ -71,11 +72,12 @@ public class M98bItem extends GunItem implements GeoItem { if (player == null) return PlayState.STOP; ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; - final var tag = NBTTool.getTag(stack); + var data = GunData.from(stack); + final var tag = data.getTag(); if (player.isSprinting() && player.onGround() && player.getPersistentData().getDouble("noRun") == 0 - && !(tag.getBoolean("is_normal_reloading") || tag.getBoolean("is_empty_reloading")) && ClientEventHandler.drawTime < 0.01) { + && !(data.normalReloading() || data.emptyReloading()) && ClientEventHandler.drawTime < 0.01) { if (player.hasEffect(MobEffects.MOVEMENT_SPEED) && GunsTool.getGunIntTag(tag, "BoltActionTick") == 0) { return event.setAndContinue(RawAnimation.begin().thenLoop("animation.m98b.run_fast")); } else { 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 c91eed5cb..559f9c73d 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 @@ -5,6 +5,7 @@ import com.atsuishio.superbwarfare.client.renderer.item.MosinNagantItemRenderer; import com.atsuishio.superbwarfare.event.ClientEventHandler; 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.perk.Perk; import com.atsuishio.superbwarfare.perk.PerkHelper; @@ -49,7 +50,8 @@ public class MosinNagantItem extends GunItem implements GeoItem { if (player == null) return PlayState.STOP; ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; - final var tag = NBTTool.getTag(stack); + var data = GunData.from(stack); + final var tag = data.getTag(); if (GunsTool.getGunIntTag(tag, "BoltActionTick") > 0) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.mosin.shift")); @@ -83,16 +85,18 @@ public class MosinNagantItem extends GunItem implements GeoItem { if (player == null) return PlayState.STOP; ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; - final var tag = NBTTool.getTag(stack); + var data = GunData.from(stack); + final var tag = data.getTag(); if (player.isSprinting() && player.onGround() && player.getPersistentData().getDouble("noRun") == 0 - && !(NBTTool.getTag(stack).getBoolean("is_empty_reloading")) + && !(GunData.from(stack).emptyReloading()) && NBTTool.getTag(stack).getInt("reload_stage") != 1 && NBTTool.getTag(stack).getInt("reload_stage") != 2 && NBTTool.getTag(stack).getInt("reload_stage") != 3 && ClientEventHandler.drawTime < 0.01 - && !GunsTool.getGunBooleanTag(tag, "Reloading")) { + && !data.isReloading() + ) { if (player.hasEffect(MobEffects.MOVEMENT_SPEED) && GunsTool.getGunIntTag(tag, "BoltActionTick") == 0) { return event.setAndContinue(RawAnimation.begin().thenLoop("animation.mosin.run_fast")); } else { diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/SentinelItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/SentinelItem.java index df51358c2..f799ccfa3 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/SentinelItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/SentinelItem.java @@ -8,6 +8,7 @@ import com.atsuishio.superbwarfare.init.ModRarity; import com.atsuishio.superbwarfare.init.ModSounds; import com.atsuishio.superbwarfare.init.ModTags; import com.atsuishio.superbwarfare.item.EnergyStorageItem; +import com.atsuishio.superbwarfare.item.gun.GunData; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.perk.Perk; import com.atsuishio.superbwarfare.perk.PerkHelper; @@ -76,17 +77,18 @@ public class SentinelItem extends GunItem implements GeoItem, EnergyStorageItem if (player == null) return PlayState.STOP; ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; - final var tag = NBTTool.getTag(stack); + var data = GunData.from(stack); + final var tag = data.getTag(); if (GunsTool.getGunIntTag(tag, "BoltActionTick") > 0) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.sentinel.shift")); } - if (tag.getBoolean("is_empty_reloading")) { + if (data.emptyReloading()) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.sentinel.reload_empty")); } - if (tag.getBoolean("is_normal_reloading")) { + if (data.normalReloading()) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.sentinel.reload_normal")); } @@ -102,11 +104,12 @@ public class SentinelItem extends GunItem implements GeoItem, EnergyStorageItem if (player == null) return PlayState.STOP; ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; - final var tag = NBTTool.getTag(stack); + var data = GunData.from(stack); + final var tag = data.getTag(); if (player.isSprinting() && player.onGround() && player.getPersistentData().getDouble("noRun") == 0 - && !(tag.getBoolean("is_normal_reloading") || tag.getBoolean("is_empty_reloading")) + && !(data.normalReloading() || data.emptyReloading()) && !GunsTool.getGunBooleanTag(tag, "Charging") && ClientEventHandler.drawTime < 0.01) { if (player.hasEffect(MobEffects.MOVEMENT_SPEED) && GunsTool.getGunIntTag(tag, "BoltActionTick") == 0) { return event.setAndContinue(RawAnimation.begin().thenLoop("animation.sentinel.run_fast")); @@ -141,7 +144,7 @@ public class SentinelItem extends GunItem implements GeoItem, EnergyStorageItem if (cap != null && cap.getEnergyStored() > 0) { cap.extractEnergy(1, false); GunsTool.setGunDoubleTag(tag, "ChargedDamage", 0.2857142857142857 - * GunsTool.getGunDoubleTag(tag, "Damage")); + * GunData.from(stack).damage()); } else { GunsTool.setGunDoubleTag(tag, "ChargedDamage", 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 f214207d5..f570dcffb 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 @@ -6,6 +6,7 @@ import com.atsuishio.superbwarfare.client.renderer.item.SvdItemRenderer; import com.atsuishio.superbwarfare.event.ClientEventHandler; 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.perk.Perk; import com.atsuishio.superbwarfare.perk.PerkHelper; @@ -16,18 +17,15 @@ import net.minecraft.client.player.LocalPlayer; import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvent; import net.minecraft.world.effect.MobEffects; -import net.minecraft.world.entity.Entity; 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 software.bernie.geckolib.animatable.GeoItem; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animation.*; import software.bernie.geckolib.renderer.GeoItemRenderer; import software.bernie.geckolib.util.GeckoLibUtil; -import javax.annotation.ParametersAreNonnullByDefault; import java.util.Set; public class SvdItem extends GunItem implements GeoItem { @@ -54,11 +52,11 @@ public class SvdItem extends GunItem implements GeoItem { ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; - if (NBTTool.getTag(stack).getBoolean("is_empty_reloading")) { + if (GunData.from(stack).emptyReloading()) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.svd.reload_empty")); } - if (NBTTool.getTag(stack).getBoolean("is_normal_reloading")) { + if (GunData.from(stack).normalReloading()) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.svd.reload_normal")); } @@ -107,30 +105,28 @@ public class SvdItem extends GunItem implements GeoItem { } @Override - @ParametersAreNonnullByDefault - public void inventoryTick(ItemStack stack, Level world, Entity entity, int slot, boolean selected) { - super.inventoryTick(stack, world, entity, slot, selected); - - final var tag = NBTTool.getTag(stack); - int scopeType = GunsTool.getAttachmentType(tag, GunsTool.AttachmentType.SCOPE); - int magType = GunsTool.getAttachmentType(tag, GunsTool.AttachmentType.MAGAZINE); - - int customMag = switch (magType) { + public int getCustomMagazine(ItemStack stack) { + int magType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.MAGAZINE); + return switch (magType) { case 1 -> 10; case 2 -> 20; default -> 0; }; + } - double customZoom = switch (scopeType) { + @Override + public double getCustomZoom(ItemStack stack) { + int scopeType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.SCOPE); + return switch (scopeType) { case 0, 1 -> 0; case 2 -> 3.75; - default -> GunsTool.getGunDoubleTag(tag, "CustomZoom"); + default -> GunsTool.getGunDoubleTag(NBTTool.getTag(stack), "CustomZoom"); }; + } - tag.putBoolean("CanAdjustZoomFov", scopeType == 3); - GunsTool.setGunDoubleTag(tag, "CustomZoom", customZoom); - GunsTool.setGunIntTag(tag, "CustomMagazine", customMag); - NBTTool.saveTag(stack, tag); + @Override + public boolean canAdjustZoom(ItemStack stack) { + return GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.SCOPE) == 3; } @Override 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 fdc43ceb3..01173ee34 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 @@ -11,6 +11,7 @@ import com.atsuishio.superbwarfare.init.ModPerks; import com.atsuishio.superbwarfare.init.ModSounds; import com.atsuishio.superbwarfare.init.ModTags; import com.atsuishio.superbwarfare.item.EnergyStorageItem; +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; @@ -96,7 +97,7 @@ public class TaserItem extends GunItem implements GeoItem, SpecialFireWeapon, En ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; - if (NBTTool.getTag(stack).getBoolean("is_empty_reloading")) { + if (GunData.from(stack).emptyReloading()) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.taser.reload")); } @@ -225,14 +226,15 @@ public class TaserItem extends GunItem implements GeoItem, SpecialFireWeapon, En @Override public void fireOnPress(Player player, final CompoundTag tag) { ItemStack stack = player.getMainHandItem(); - if (GunsTool.getGunBooleanTag(tag, "Reloading")) return; + var data = GunData.from(stack); + if (data.isReloading()) return; int perkLevel = PerkHelper.getItemPerkLevel(ModPerks.VOLT_OVERLOAD.get(), tag); var energyStorage = stack.getCapability(Capabilities.EnergyStorage.ITEM); var hasEnoughEnergy = energyStorage != null && energyStorage.getEnergyStored() >= 400 + 100 * perkLevel; if (player.getCooldowns().isOnCooldown(stack.getItem()) - || GunsTool.getGunIntTag(tag, "Ammo") <= 0 + || data.getAmmo() <= 0 || !hasEnoughEnergy ) return; @@ -241,7 +243,7 @@ public class TaserItem extends GunItem implements GeoItem, SpecialFireWeapon, En if (player instanceof ServerPlayer serverPlayer) { var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE); boolean zoom = cap != null && cap.zoom; - double spread = GunsTool.getGunDoubleTag(tag, "Spread"); + double spread = data.spread(); int volt = PerkHelper.getItemPerkLevel(ModPerks.VOLT_OVERLOAD.get(), tag); int wireLength = PerkHelper.getItemPerkLevel(ModPerks.LONGER_WIRE.get(), tag); @@ -252,19 +254,20 @@ public class TaserItem extends GunItem implements GeoItem, SpecialFireWeapon, En var level = serverPlayer.level(); TaserBulletEntity taserBulletProjectile = new TaserBulletEntity(player, level, - (float) GunsTool.getGunDoubleTag(tag, "Damage"), volt, wireLength); + (float) data.damage(), volt, wireLength); taserBulletProjectile.setPos(player.getX(), player.getEyeY() - 0.1, player.getZ()); - taserBulletProjectile.shoot(player.getLookAngle().x, player.getLookAngle().y, player.getLookAngle().z, (float) GunsTool.getGunDoubleTag(tag, "Velocity"), + taserBulletProjectile.shoot(player.getLookAngle().x, player.getLookAngle().y, player.getLookAngle().z, (float) data.velocity(), (float) (zoom ? 0.1 : spread)); level.addFreshEntity(taserBulletProjectile); PacketDistributor.sendToPlayer(serverPlayer, new ShootClientMessage(10)); } - GunsTool.setGunIntTag(tag, "Ammo", GunsTool.getGunIntTag(tag, "Ammo") - 1); + data.setAmmo(data.getAmmo() - 1); + data.getTag().putBoolean("shoot", true); + data.save(); energyStorage.extractEnergy(400 + 100 * perkLevel, false); - tag.putBoolean("shoot", true); } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/menu/ReforgingTableMenu.java b/src/main/java/com/atsuishio/superbwarfare/menu/ReforgingTableMenu.java index bfc3c00f1..c6be83c21 100644 --- a/src/main/java/com/atsuishio/superbwarfare/menu/ReforgingTableMenu.java +++ b/src/main/java/com/atsuishio/superbwarfare/menu/ReforgingTableMenu.java @@ -4,6 +4,7 @@ import com.atsuishio.superbwarfare.init.ModBlocks; import com.atsuishio.superbwarfare.init.ModMenuTypes; import com.atsuishio.superbwarfare.init.ModTags; import com.atsuishio.superbwarfare.item.PerkItem; +import com.atsuishio.superbwarfare.item.gun.GunData; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.perk.Perk; import com.atsuishio.superbwarfare.perk.PerkHelper; @@ -207,16 +208,17 @@ public class ReforgingTableMenu extends AbstractContainerMenu { if (!(stack.getItem() instanceof GunItem)) { return; } + var data = GunData.from(stack); + var tag = data.getTag(); - final var tag = NBTTool.getTag(stack); - double oldPoint = GunsTool.getGunDoubleTag(tag, "UpgradePoint"); + double oldPoint = data.getUpgradePoint(); int point = (int) oldPoint; int newPoint = this.upgradePoint.get(); int delta = newPoint - point; if (delta != 0) { GunsTool.setGunDoubleTag(tag, "UpgradePoint", oldPoint + delta); - NBTTool.saveTag(stack, tag); + data.save(); } } @@ -293,19 +295,20 @@ public class ReforgingTableMenu extends AbstractContainerMenu { final var tag = NBTTool.getTag(gun); int level = PerkHelper.getItemPerkLevel(perkItem.getPerk(), tag); + var data = GunData.from(gun); if (level <= 0) { - this.upgradePoint.set((int) GunsTool.getGunDoubleTag(tag, "UpgradePoint")); + this.upgradePoint.set((int) data.getUpgradePoint()); return; } ItemStack output = gun.copy(); final var outputTag = NBTTool.getTag(output); PerkHelper.removePerkByType(outputTag, perkItem.getPerk().type); - GunsTool.setGunDoubleTag(outputTag, "UpgradePoint", Math.min(MAX_UPGRADE_POINT, level - 1 + GunsTool.getGunDoubleTag(outputTag, "UpgradePoint"))); - this.upgradePoint.set((int) GunsTool.getGunDoubleTag(outputTag, "UpgradePoint")); + data.setUpgradePoint(Math.min(MAX_UPGRADE_POINT, level - 1 + data.getUpgradePoint())); + this.upgradePoint.set((int) data.getUpgradePoint()); - NBTTool.saveTag(output, outputTag); + data.save(); this.container.setItem(INPUT_SLOT, output); this.container.setChanged(); } @@ -334,11 +337,11 @@ public class ReforgingTableMenu extends AbstractContainerMenu { * @param stack 输入的枪械 */ private void onPlaceGun(ItemStack stack) { - if (!(stack.getItem() instanceof GunItem)) { - return; - } - final var tag = NBTTool.getTag(stack); - int point = (int) GunsTool.getGunDoubleTag(tag, "UpgradePoint"); + if (!(stack.getItem() instanceof GunItem)) return; + var data = GunData.from(stack); + var tag = data.getTag(); + + int point = (int) data.getUpgradePoint(); this.upgradePoint.set(Mth.clamp(point, 0, MAX_UPGRADE_POINT)); var ammoPerk = PerkHelper.getPerkByType(tag, Perk.Type.AMMO); diff --git a/src/main/java/com/atsuishio/superbwarfare/network/message/send/AdjustZoomFovMessage.java b/src/main/java/com/atsuishio/superbwarfare/network/message/send/AdjustZoomFovMessage.java index b73d9205f..cee7be1e0 100644 --- a/src/main/java/com/atsuishio/superbwarfare/network/message/send/AdjustZoomFovMessage.java +++ b/src/main/java/com/atsuishio/superbwarfare/network/message/send/AdjustZoomFovMessage.java @@ -4,9 +4,9 @@ import com.atsuishio.superbwarfare.Mod; import com.atsuishio.superbwarfare.init.ModItems; import com.atsuishio.superbwarfare.init.ModSounds; import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.GunData; import com.atsuishio.superbwarfare.tools.FormatTool; import com.atsuishio.superbwarfare.tools.GunsTool; -import com.atsuishio.superbwarfare.tools.NBTTool; import com.atsuishio.superbwarfare.tools.SoundTool; import io.netty.buffer.ByteBuf; import net.minecraft.network.chat.Component; @@ -33,32 +33,33 @@ public record AdjustZoomFovMessage(double scroll) implements CustomPacketPayload ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return; + var data = GunData.from(stack); + var tag = data.getTag(); - final var tag = NBTTool.getTag(stack); if (stack.is(ModItems.MINIGUN.get())) { double minRpm = 300; double maxRpm = 2400; - GunsTool.setGunIntTag(tag, "RPM", (int) Mth.clamp(GunsTool.getGunIntTag(tag, "RPM") + 50 * message.scroll, minRpm, maxRpm)); - if (GunsTool.getGunIntTag(tag, "RPM") == 1150) { - GunsTool.setGunIntTag(tag, "RPM", 1145); + GunsTool.setGunIntTag(tag, "CustomRPM", (int) Mth.clamp(GunsTool.getGunIntTag(tag, "CustomRPM") - 1200 + 50 * message.scroll, minRpm, maxRpm)); + if (GunsTool.getGunIntTag(tag, "CustomRPM") == 1150 - 1200) { + GunsTool.setGunIntTag(tag, "CustomRPM", 1145 - 1200); } - if (GunsTool.getGunIntTag(tag, "RPM") == 1195) { - GunsTool.setGunIntTag(tag, "RPM", 1200); + if (GunsTool.getGunIntTag(tag, "CustomRPM") == 1195 - 1200) { + GunsTool.setGunIntTag(tag, "CustomRPM", 0); } - if (GunsTool.getGunIntTag(tag, "RPM") == 1095) { - GunsTool.setGunIntTag(tag, "RPM", 1100); + if (GunsTool.getGunIntTag(tag, "CustomRPM") == 1095 - 1200) { + GunsTool.setGunIntTag(tag, "CustomRPM", 1100 - 1200); } - player.displayClientMessage(Component.literal("RPM: " + FormatTool.format0D(GunsTool.getGunIntTag(tag, "RPM"))), true); - int rpm = GunsTool.getGunIntTag(tag, "RPM"); + player.displayClientMessage(Component.literal("RPM: " + FormatTool.format0D(GunsTool.getGunIntTag(tag, "CustomRPM") + 1200)), true); + int rpm = GunsTool.getGunIntTag(tag, "CustomRPM"); if (rpm > minRpm && rpm < maxRpm) { SoundTool.playLocalSound(player, ModSounds.ADJUST_FOV.get(), 1f, 0.7f); } } else { - double minZoom = GunsTool.getGunDoubleTag(tag, "MinZoom") - 1.25; - double maxZoom = GunsTool.getGunDoubleTag(tag, "MaxZoom") - 1.25; + double minZoom = data.minZoom() - 1.25; + double maxZoom = data.maxZoom() - 1.25; double customZoom = GunsTool.getGunDoubleTag(tag, "CustomZoom"); GunsTool.setGunDoubleTag(tag, "CustomZoom", Mth.clamp(customZoom + 0.5 * message.scroll, minZoom, maxZoom)); if (GunsTool.getGunDoubleTag(tag, "CustomZoom") > minZoom && @@ -66,7 +67,7 @@ public record AdjustZoomFovMessage(double scroll) implements CustomPacketPayload SoundTool.playLocalSound(player, ModSounds.ADJUST_FOV.get(), 1f, 0.7f); } } - NBTTool.saveTag(stack, tag); + data.save(); } @Override 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 266f17477..381bb0ad5 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 @@ -6,6 +6,7 @@ import com.atsuishio.superbwarfare.entity.projectile.ProjectileEntity; import com.atsuishio.superbwarfare.event.GunEventHandler; import com.atsuishio.superbwarfare.init.ModPerks; import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.GunData; import com.atsuishio.superbwarfare.item.gun.SpecialFireWeapon; import com.atsuishio.superbwarfare.perk.AmmoPerk; import com.atsuishio.superbwarfare.perk.Perk; @@ -51,8 +52,8 @@ public record FireMessage(int msgType) implements CustomPacketPayload { var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE); if (type == 0) { - if (tag.getDouble("prepare") == 0 && GunsTool.getGunBooleanTag(tag, "Reloading") && GunsTool.getGunIntTag(tag, "Ammo") > 0) { - tag.putDouble("force_stop", 1); + var data = GunData.from(stack); + if (tag.getDouble("prepare") == 0 && data.isReloading() && data.getAmmo() > 0) { NBTTool.saveTag(stack, tag); } @@ -87,18 +88,20 @@ public record FireMessage(int msgType) implements CustomPacketPayload { NBTTool.saveTag(stack, tag); } - private static void handleGunBolt(Player player, ItemStack stack, final CompoundTag tag) { + private static void handleGunBolt(Player player, ItemStack stack, CompoundTag tag) { if (!stack.is(ModTags.Items.GUN)) return; + var data = GunData.from(stack); + tag = data.getTag(); - if (GunsTool.getGunIntTag(tag, "BoltActionTime") > 0 - && GunsTool.getGunIntTag(tag, "Ammo") > (stack.is(ModTags.Items.REVOLVER) ? -1 : 0) + if (data.boltActionTime() > 0 + && data.getAmmo() > (stack.is(ModTags.Items.REVOLVER) ? -1 : 0) && GunsTool.getGunIntTag(tag, "BoltActionTick") == 0 - && !(tag.getBoolean("is_normal_reloading") - || tag.getBoolean("is_empty_reloading")) - && !GunsTool.getGunBooleanTag(tag, "Reloading") + && !(data.normalReloading() + || data.emptyReloading()) + && !data.isReloading() && !GunsTool.getGunBooleanTag(tag, "Charging")) { if (!player.getCooldowns().isOnCooldown(stack.getItem()) && GunsTool.getGunBooleanTag(tag, "NeedBoltAction")) { - GunsTool.setGunIntTag(tag, "BoltActionTick", GunsTool.getGunIntTag(tag, "BoltActionTime") + 1); + GunsTool.setGunIntTag(tag, "BoltActionTick", data.boltActionTime() + 1); GunEventHandler.playGunBoltSounds(player); } } @@ -124,11 +127,12 @@ public record FireMessage(int msgType) implements CustomPacketPayload { public static void spawnBullet(Player player, final CompoundTag tag) { ItemStack stack = player.getMainHandItem(); if (player.level().isClientSide()) return; + var data = GunData.from(stack); var perk = PerkHelper.getPerkByType(tag, Perk.Type.AMMO); - float headshot = (float) GunsTool.getGunDoubleTag(tag, "Headshot"); + float headshot = (float) data.headshot(); float velocity = 2 * (float) GunsTool.getGunDoubleTag(tag, "Power", 6) * (float) perkSpeed(tag); - float bypassArmorRate = (float) GunsTool.getGunDoubleTag(tag, "BypassesArmor"); + float bypassArmorRate = (float) data.bypassArmor(); double damage; var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE); @@ -137,12 +141,12 @@ public record FireMessage(int msgType) implements CustomPacketPayload { float spread; if (zoom) { spread = 0.01f; - damage = 0.08333333 * GunsTool.getGunDoubleTag(tag, "Damage") * + damage = 0.08333333 * data.damage() * GunsTool.getGunDoubleTag(tag, "Power", 6) * perkDamage(stack); } else { spread = perk instanceof AmmoPerk ammoPerk && ammoPerk.slug ? 0.5f : 2.5f; damage = (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug ? 0.08333333 : 0.008333333) * - GunsTool.getGunDoubleTag(tag, "Damage") * + data.damage() * GunsTool.getGunDoubleTag(tag, "Power", 6) * perkDamage(stack); } 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 7c5cdf922..a5aa241c3 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 @@ -3,9 +3,9 @@ package com.atsuishio.superbwarfare.network.message.send; import com.atsuishio.superbwarfare.Mod; import com.atsuishio.superbwarfare.init.ModItems; import com.atsuishio.superbwarfare.init.ModSounds; +import com.atsuishio.superbwarfare.item.gun.GunData; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.tools.GunsTool; -import com.atsuishio.superbwarfare.tools.NBTTool; import com.atsuishio.superbwarfare.tools.SoundTool; import io.netty.buffer.ByteBuf; import net.minecraft.network.codec.ByteBufCodecs; @@ -34,53 +34,54 @@ public record FireModeMessage(int msgType) implements CustomPacketPayload { public static void changeFireMode(Player player) { ItemStack stack = player.getMainHandItem(); if (stack.getItem() instanceof GunItem gunItem) { - final var tag = NBTTool.getTag(stack); - int fireMode = tag.getCompound("GunData").getInt("FireMode"); + var data = GunData.from(stack); + var tag = data.getTag(); + int fireMode = data.getFireMode(); int mode = gunItem.getAvailableFireModes(); mode &= 0b111; if (fireMode == 0) { if ((mode & 2) != 0) { - GunsTool.setGunIntTag(tag, "FireMode", 1); + data.setFireMode(1); playChangeModeSound(player); - NBTTool.saveTag(stack, tag); + data.save(); return; } if ((mode & 4) != 0) { - GunsTool.setGunIntTag(tag, "FireMode", 2); + data.setFireMode(2); playChangeModeSound(player); - NBTTool.saveTag(stack, tag); + data.save(); return; } } if (fireMode == 1) { if ((mode & 4) != 0) { - GunsTool.setGunIntTag(tag, "FireMode", 2); + data.setFireMode(2); playChangeModeSound(player); - NBTTool.saveTag(stack, tag); + data.save(); return; } if ((mode & 1) != 0) { - GunsTool.setGunIntTag(tag, "FireMode", 0); + data.setFireMode(0); playChangeModeSound(player); - NBTTool.saveTag(stack, tag); + data.save(); return; } } if (fireMode == 2) { if ((mode & 1) != 0) { - GunsTool.setGunIntTag(tag, "FireMode", 0); + data.setFireMode(0); playChangeModeSound(player); - NBTTool.saveTag(stack, tag); + data.save(); return; } if ((mode & 2) != 0) { - GunsTool.setGunIntTag(tag, "FireMode", 1); + data.setFireMode(1); playChangeModeSound(player); - NBTTool.saveTag(stack, tag); + data.save(); return; } } @@ -103,7 +104,7 @@ public record FireModeMessage(int msgType) implements CustomPacketPayload { if (stack.getItem() == ModItems.JAVELIN.get()) { tag.putBoolean("TopMode", !tag.getBoolean("TopMode")); - NBTTool.saveTag(stack, tag); + data.save(); if (player instanceof ServerPlayer serverPlayer) { SoundTool.playLocalSound(serverPlayer, ModSounds.CANNON_ZOOM_OUT.get()); } @@ -111,13 +112,13 @@ public record FireModeMessage(int msgType) implements CustomPacketPayload { if (stack.getItem() == ModItems.TRACHELIUM.get() && !GunsTool.getGunBooleanTag(tag, "NeedBoltAction")) { tag.putBoolean("DA", !tag.getBoolean("DA")); - NBTTool.saveTag(stack, tag); + data.save(); if (!tag.getBoolean("canImmediatelyShoot")) { GunsTool.setGunBooleanTag(tag, "NeedBoltAction", true); } } - NBTTool.saveTag(stack, tag); + data.save(); } } 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 491852d09..ed493d2ec 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 @@ -4,9 +4,9 @@ import com.atsuishio.superbwarfare.Mod; import com.atsuishio.superbwarfare.capability.ModCapabilities; import com.atsuishio.superbwarfare.init.ModItems; import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.GunData; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.tools.GunsTool; -import com.atsuishio.superbwarfare.tools.NBTTool; import io.netty.buffer.ByteBuf; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; @@ -38,19 +38,20 @@ public record ReloadMessage(int msgType) implements CustomPacketPayload { } ItemStack stack = player.getMainHandItem(); - var tag = NBTTool.getTag(stack); - var data = tag.getCompound("GunData"); + if (!(stack.getItem() instanceof GunItem gunItem)) return; + + var data = GunData.from(stack); + var tag = data.getTag(); if (!player.isSpectator() - && stack.getItem() instanceof GunItem gunItem && !GunsTool.getGunBooleanTag(tag, "Charging") && GunsTool.getGunIntTag(tag, "ReloadTime") == 0 && GunsTool.getGunIntTag(tag, "BoltActionTick") == 0 - && !GunsTool.getGunBooleanTag(tag, "Reloading") + && !data.isReloading() ) { boolean canSingleReload = gunItem.isIterativeReload(stack); boolean canReload = gunItem.isMagazineReload(stack) && !gunItem.isClipReload(stack); - boolean clipLoad = GunsTool.getGunIntTag(tag, "Ammo") == 0 && gunItem.isClipReload(stack); + boolean clipLoad = data.getAmmo() == 0 && gunItem.isClipReload(stack); // 检查备弹 boolean hasCreativeAmmoBox = player.getInventory().hasAnyMatching(item -> item.is(ModItems.CREATIVE_AMMO_BOX.get())); @@ -74,33 +75,28 @@ public record ReloadMessage(int msgType) implements CustomPacketPayload { } if (canReload || clipLoad) { - int magazine = GunsTool.getGunIntTag(tag, "Magazine"); - int ammo = GunsTool.getGunIntTag(tag, "Ammo"); - int customMagazine = GunsTool.getGunIntTag(tag, "CustomMagazine"); + int magazine = data.magazine(); if (gunItem.isOpenBolt(stack)) { if (gunItem.hasBulletInBarrel(stack)) { - if (ammo < magazine + customMagazine + 1) { - data.putBoolean("StartReload", true); + if (data.getAmmo() < magazine + 1) { + GunsTool.setGunBooleanTag(tag, "StartReload", true); + } + } else { + if (data.getAmmo() < magazine) { + GunsTool.setGunBooleanTag(tag, "StartReload", true); } - } else if (ammo < magazine + customMagazine) { - data.putBoolean("StartReload", true); } - } else if (ammo < magazine + customMagazine) { - data.putBoolean("StartReload", true); + } else if (data.getAmmo() < magazine) { + GunsTool.setGunBooleanTag(tag, "StartReload", true); } - NBTTool.saveTag(stack, tag); return; } - if (canSingleReload - && GunsTool.getGunIntTag(tag, "Ammo") - < GunsTool.getGunIntTag(tag, "Magazine") - + GunsTool.getGunIntTag(tag, "CustomMagazine")) { - + if (canSingleReload && data.getAmmo() < data.magazine()) { tag.putBoolean("start_single_reload", true); } - NBTTool.saveTag(stack, tag); + 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 0005990a6..8c32d9c59 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 @@ -7,10 +7,14 @@ 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.perk.AmmoPerk; import com.atsuishio.superbwarfare.perk.Perk; import com.atsuishio.superbwarfare.perk.PerkHelper; -import com.atsuishio.superbwarfare.tools.*; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.InventoryTool; +import com.atsuishio.superbwarfare.tools.ParticleTool; +import com.atsuishio.superbwarfare.tools.SoundTool; import io.netty.buffer.ByteBuf; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.network.codec.ByteBufCodecs; @@ -40,14 +44,15 @@ public record ShootMessage(double spread) implements CustomPacketPayload { public static void pressAction(Player player, double spared) { ItemStack stack = player.getMainHandItem(); - final var tag = NBTTool.getTag(stack); + var data = GunData.from(stack); + var tag = data.getTag(); if (stack.is(ModTags.Items.NORMAL_GUN)) { - int projectileAmount = GunsTool.getGunIntTag(tag, "ProjectileAmount", 1); + int projectileAmount = data.projectileAmount(); - if (GunsTool.getGunIntTag(tag, "Ammo") > 0) { + if (data.getAmmo() > 0) { // 空仓挂机 - if (GunsTool.getGunIntTag(tag, "Ammo") == 1) { + if (data.getAmmo() == 1) { GunsTool.setGunBooleanTag(tag, "HoldOpen", true); } @@ -56,14 +61,14 @@ public record ShootMessage(double spread) implements CustomPacketPayload { } // 判断是否为栓动武器(BoltActionTime > 0),并在开火后给一个需要上膛的状态 - if (GunsTool.getGunIntTag(tag, "BoltActionTime") > 0 && GunsTool.getGunIntTag(tag, "Ammo") > (stack.is(ModTags.Items.REVOLVER) ? 0 : 1)) { + if (data.boltActionTime() > 0 && data.getAmmo() > (stack.is(ModTags.Items.REVOLVER) ? 0 : 1)) { GunsTool.setGunBooleanTag(tag, "NeedBoltAction", true); } - GunsTool.setGunIntTag(tag, "Ammo", GunsTool.getGunIntTag(tag, "Ammo") - 1); + data.setAmmo(data.getAmmo() - 1); tag.putDouble("empty", 1); - if (stack.getItem() == ModItems.M_60.get() && GunsTool.getGunIntTag(tag, "Ammo") <= 5) { + if (stack.getItem() == ModItems.M_60.get() && data.getAmmo() <= 5) { GunsTool.setGunBooleanTag(tag, "HideBulletChain", true); } @@ -90,7 +95,6 @@ public record ShootMessage(double spread) implements CustomPacketPayload { } GunEventHandler.playGunSounds(player); - NBTTool.saveTag(stack, tag); } } else if (stack.is(ModItems.MINIGUN.get())) { var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE); @@ -110,7 +114,7 @@ public record ShootMessage(double spread) implements CustomPacketPayload { float pitch = tag.getDouble("heat") <= 40 ? 1 : (float) (1 - 0.025 * Math.abs(40 - tag.getDouble("heat"))); if (!player.level().isClientSide() && player instanceof ServerPlayer) { - float soundRadius = (float) GunsTool.getGunDoubleTag(tag, "SoundRadius"); + float soundRadius = (float) data.soundRadius(); player.playSound(ModSounds.MINIGUN_FIRE_3P.get(), soundRadius * 0.2f, pitch); player.playSound(ModSounds.MINIGUN_FAR.get(), soundRadius * 0.5f, pitch); @@ -126,10 +130,9 @@ public record ShootMessage(double spread) implements CustomPacketPayload { cap.rifleAmmo = cap.rifleAmmo - 1; cap.syncPlayerVariables(player); } - - NBTTool.saveTag(stack, tag); } } + data.save(); } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/perk/PerkHelper.java b/src/main/java/com/atsuishio/superbwarfare/perk/PerkHelper.java index 898346652..b1ce10ba4 100644 --- a/src/main/java/com/atsuishio/superbwarfare/perk/PerkHelper.java +++ b/src/main/java/com/atsuishio/superbwarfare/perk/PerkHelper.java @@ -3,6 +3,7 @@ package com.atsuishio.superbwarfare.perk; import com.atsuishio.superbwarfare.init.ModItems; import com.atsuishio.superbwarfare.init.ModPerks; import com.atsuishio.superbwarfare.item.PerkItem; +import com.atsuishio.superbwarfare.item.gun.GunData; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; @@ -64,6 +65,10 @@ public class PerkHelper { }; } + public static int getItemPerkLevel(Perk perk, GunData data) { + return getItemPerkLevel(perk, data.getTag()); + } + public static int getItemPerkLevel(Perk perk, final CompoundTag tag) { var tagPerk = tag.getCompound(TAG_PERK); if (!tagPerk.contains(perk.type.getName())) { @@ -83,6 +88,10 @@ public class PerkHelper { return getPerkLevel(getPerkTag(tag, perk.type)); } + public static CompoundTag getPerkTag(GunData data, Perk.Type type) { + return getPerkTag(data.getTag(), type); + } + public static CompoundTag getPerkTag(final CompoundTag tag, Perk.Type type) { var tagPerk = tag.getCompound(TAG_PERK); if (!tagPerk.contains(type.getName())) return new CompoundTag(); @@ -103,6 +112,11 @@ public class PerkHelper { setPerk(tag, perk, 1); } + public static Perk getPerkByType(GunData data, Perk.Type type) { + return getPerkByType(data.getTag(), type); + } + + @Nullable public static Perk getPerkByType(final CompoundTag tag, Perk.Type type) { var tagPerk = tag.getCompound(TAG_PERK); diff --git a/src/main/java/com/atsuishio/superbwarfare/tools/GunsTool.java b/src/main/java/com/atsuishio/superbwarfare/tools/GunsTool.java index 4f6c37e29..42b41dc45 100644 --- a/src/main/java/com/atsuishio/superbwarfare/tools/GunsTool.java +++ b/src/main/java/com/atsuishio/superbwarfare/tools/GunsTool.java @@ -3,6 +3,7 @@ package com.atsuishio.superbwarfare.tools; import com.atsuishio.superbwarfare.Mod; import com.atsuishio.superbwarfare.capability.ModCapabilities; import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.GunData; import com.atsuishio.superbwarfare.network.message.receive.GunsDataMessage; import com.google.gson.stream.JsonReader; import net.minecraft.nbt.CompoundTag; @@ -58,22 +59,23 @@ public class GunsTool { if (gunsData != null && gunsData.get(location) != null) { CompoundTag data = tag.getCompound("GunData"); - gunsData.get(location).forEach(data::putDouble); + // gunsData.get(location).forEach(data::putDouble); + data.putBoolean("Init", true); tag.put("GunData", data); } } - public static void initCreativeGun(final CompoundTag tag, String location) { - var fillAmmo = !tag.getCompound("GunData").getBoolean("Init"); + public static void initCreativeGun(ItemStack stack, String location) { + var data = GunData.from(stack); + var fillAmmo = !data.getData().getBoolean("Init"); - initGun(tag, location); + initGun(data.getTag(), location); + data.save(); if (fillAmmo) { - var data = tag.getCompound("GunData"); - data.putInt("Ammo", GunsTool.getGunIntTag(tag, "Magazine") - + GunsTool.getGunIntTag(tag, "CustomMagazine") - ); + data.setAmmo(data.magazine()); + data.save(); } } @@ -120,19 +122,19 @@ public class GunsTool { }); } - public static void reload(Player player, ItemStack stack, final CompoundTag tag, AmmoType type) { - reload(player, stack, tag, type, false); + public static void reload(Player player, ItemStack stack, GunData gunData, AmmoType type) { + reload(player, stack, gunData, type, false); } - public static void reload(Player player, ItemStack stack, final CompoundTag tag, AmmoType type, boolean extraOne) { - final var data = tag.getCompound("GunData"); + public static void reload(Player player, ItemStack stack, GunData gunData, AmmoType type, boolean extraOne) { + var data = gunData.getData(); - int mag = data.getInt("Magazine") + data.getInt("CustomMagazine"); - int ammo = data.getInt("Ammo"); + int mag = gunData.magazine(); + int ammo = gunData.getAmmo(); int ammoToAdd = mag - ammo + (extraOne ? 1 : 0); // 空仓换弹的栓动武器应该在换弹后取消待上膛标记 - if (ammo == 0 && data.getInt("BoltActionTime") > 0 && !stack.is(ModTags.Items.REVOLVER)) { + if (ammo == 0 && gunData.boltActionTime() > 0 && !stack.is(ModTags.Items.REVOLVER)) { data.putBoolean("NeedBoltAction", false); } @@ -148,9 +150,9 @@ public class GunsTool { int needToAdd = ammo + Math.min(ammoToAdd, playerAmmo); - data.putInt("Ammo", needToAdd); - tag.putBoolean("is_normal_reloading", false); - tag.putBoolean("is_empty_reloading", false); + gunData.setAmmo(needToAdd); + gunData.setReloadState(GunData.ReloadState.NOT_RELOADING); + gunData.save(); } /* PerkData */ diff --git a/src/main/resources/data/superbwarfare/guns/bocek.json b/src/main/resources/data/superbwarfare/guns/bocek.json index 865b77e9c..53c94ede2 100644 --- a/src/main/resources/data/superbwarfare/guns/bocek.json +++ b/src/main/resources/data/superbwarfare/guns/bocek.json @@ -1,5 +1,5 @@ { - "CustomZoom": 0.75, + "DefaultZoom": 0.75, "Spread": 4, "Headshot": 2.5, "Damage": 48, diff --git a/src/main/resources/data/superbwarfare/guns/devotion.json b/src/main/resources/data/superbwarfare/guns/devotion.json index d0eb57949..bc7baf82d 100644 --- a/src/main/resources/data/superbwarfare/guns/devotion.json +++ b/src/main/resources/data/superbwarfare/guns/devotion.json @@ -1,5 +1,5 @@ { - "CustomZoom": 0.75, + "DefaultZoom": 0.75, "Spread": 5, "RecoilX": 0.0018, "RecoilY": 0.01, diff --git a/src/main/resources/data/superbwarfare/guns/insidious.json b/src/main/resources/data/superbwarfare/guns/insidious.json index f8b48bc2a..646aad8c4 100644 --- a/src/main/resources/data/superbwarfare/guns/insidious.json +++ b/src/main/resources/data/superbwarfare/guns/insidious.json @@ -8,7 +8,7 @@ "Magazine": 48, "Weight": 6, "FireMode": 1, - "BurstSize": 4, + "BurstAmount": 4, "EmptyReloadTime": 56, "BypassesArmor": 0.4, "SoundRadius": 12, diff --git a/src/main/resources/data/superbwarfare/guns/javelin.json b/src/main/resources/data/superbwarfare/guns/javelin.json index ae0d7d302..5c7086ed6 100644 --- a/src/main/resources/data/superbwarfare/guns/javelin.json +++ b/src/main/resources/data/superbwarfare/guns/javelin.json @@ -1,5 +1,5 @@ { - "CustomZoom": 1.75, + "DefaultZoom": 1.75, "Spread": 5, "Magazine": 1, "Weight": 10, diff --git a/src/main/resources/data/superbwarfare/guns/m_98b.json b/src/main/resources/data/superbwarfare/guns/m_98b.json index 03869e762..808c9e931 100644 --- a/src/main/resources/data/superbwarfare/guns/m_98b.json +++ b/src/main/resources/data/superbwarfare/guns/m_98b.json @@ -1,5 +1,5 @@ { - "CustomZoom": 4.75, + "DefaultZoom": 4.75, "MinZoom": 4, "MaxZoom": 8, "Spread": 6, diff --git a/src/main/resources/data/superbwarfare/guns/mosin_nagant.json b/src/main/resources/data/superbwarfare/guns/mosin_nagant.json index 4aace0cd9..aa0c7b261 100644 --- a/src/main/resources/data/superbwarfare/guns/mosin_nagant.json +++ b/src/main/resources/data/superbwarfare/guns/mosin_nagant.json @@ -1,5 +1,5 @@ { - "CustomZoom": 2.25, + "DefaultZoom": 2.25, "Spread": 4.8, "RecoilX": 0.002, "RecoilY": 0.063, diff --git a/src/main/resources/data/superbwarfare/guns/sentinel.json b/src/main/resources/data/superbwarfare/guns/sentinel.json index 2ffe85528..ff9725c33 100644 --- a/src/main/resources/data/superbwarfare/guns/sentinel.json +++ b/src/main/resources/data/superbwarfare/guns/sentinel.json @@ -1,5 +1,5 @@ { - "CustomZoom": 1.75, + "DefaultZoom": 1.75, "Spread": 6, "RecoilX": 0.007, "RecoilY": 0.018, diff --git a/src/main/resources/data/superbwarfare/guns/vector.json b/src/main/resources/data/superbwarfare/guns/vector.json index 74e1248db..578075ca4 100644 --- a/src/main/resources/data/superbwarfare/guns/vector.json +++ b/src/main/resources/data/superbwarfare/guns/vector.json @@ -8,7 +8,7 @@ "Magazine": 13, "Weight": 3, "FireMode": 2, - "BurstSize": 3, + "BurstAmount": 3, "NormalReloadTime": 46, "EmptyReloadTime": 64, "BypassesArmor": 0.15,