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 d6d79c0f6..1258212a2 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/tooltip/ClientGunImageTooltip.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/tooltip/ClientGunImageTooltip.java @@ -65,7 +65,7 @@ public class ClientGunImageTooltip implements ClientTooltipComponent { } protected boolean shouldRenderBypassAndHeadshotTooltip() { - return ItemNBTTool.getDouble(stack, "BypassesArmor", 0) > 0 || GunsTool.getGunDoubleTag(stack, "Headshot", 0) > 0; + return GunsTool.getGunDoubleTag(stack, "BypassesArmor", 0) > 0 || GunsTool.getGunDoubleTag(stack, "Headshot", 0) > 0; } protected boolean shouldRenderEditTooltip() { @@ -176,7 +176,7 @@ public class ClientGunImageTooltip implements ClientTooltipComponent { int level = PerkHelper.getItemPerkLevel(perk, stack); perkBypassArmorRate = ammoPerk.bypassArmorRate + (perk == ModPerks.AP_BULLET.get() ? 0.05f * (level - 1) : 0); } - double bypassRate = Math.max(ItemNBTTool.getDouble(stack, "BypassesArmor", 0) + perkBypassArmorRate, 0); + double bypassRate = Math.max(GunsTool.getGunDoubleTag(stack, "BypassesArmor", 0) + perkBypassArmorRate, 0); return Component.translatable("des.superbwarfare.tips.bypass").withStyle(ChatFormatting.GRAY) .append(Component.literal("").withStyle(ChatFormatting.RESET)) diff --git a/src/main/java/com/atsuishio/superbwarfare/event/GunEventHandler.java b/src/main/java/com/atsuishio/superbwarfare/event/GunEventHandler.java index 9c6104ad2..885a40c1c 100644 --- a/src/main/java/com/atsuishio/superbwarfare/event/GunEventHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/event/GunEventHandler.java @@ -182,19 +182,19 @@ public class GunEventHandler { } public static void gunShoot(Player player, double spared) { - ItemStack heldItem = player.getMainHandItem(); + ItemStack stack = player.getMainHandItem(); if (!player.level().isClientSide()) { - float headshot = (float) GunsTool.getGunDoubleTag(heldItem, "Headshot", 0); - float damage = (float) (GunsTool.getGunDoubleTag(heldItem, "Damage", 0) + heldItem.getOrCreateTag().getDouble("sentinelChargeDamage")) * (float) perkDamage(heldItem); - float velocity = (float) ((GunsTool.getGunDoubleTag(heldItem, "Velocity", 0) + heldItem.getOrCreateTag().getDouble("CustomVelocity")) * perkSpeed(heldItem)); - int projectileAmount = GunsTool.getGunIntTag(heldItem, "ProjectileAmount", 1); - float bypassArmorRate = (float) heldItem.getOrCreateTag().getDouble("BypassesArmor"); + float headshot = (float) GunsTool.getGunDoubleTag(stack, "Headshot", 0); + float damage = (float) (GunsTool.getGunDoubleTag(stack, "Damage", 0) + stack.getOrCreateTag().getDouble("sentinelChargeDamage")) * (float) perkDamage(stack); + float velocity = (float) ((GunsTool.getGunDoubleTag(stack, "Velocity", 0) + stack.getOrCreateTag().getDouble("CustomVelocity")) * perkSpeed(stack)); + int projectileAmount = GunsTool.getGunIntTag(stack, "ProjectileAmount", 1); + float bypassArmorRate = (float) GunsTool.getGunDoubleTag(stack, "BypassesArmor", 0); boolean zoom = player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables()).zoom; - var perk = PerkHelper.getPerkByType(heldItem, Perk.Type.AMMO); + var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); if (perk != null && perk.descriptionId.equals("butterfly_bullet")) { - if (handleButterflyBullet(perk, heldItem, player)) return; + if (handleButterflyBullet(perk, stack, player)) return; } ProjectileEntity projectile = new ProjectileEntity(player.level()) @@ -204,7 +204,7 @@ public class GunEventHandler { .zoom(zoom); if (perk instanceof AmmoPerk ammoPerk) { - int level = PerkHelper.getItemPerkLevel(perk, heldItem); + int level = PerkHelper.getItemPerkLevel(perk, stack); bypassArmorRate += ammoPerk.bypassArmorRate + (perk == ModPerks.AP_BULLET.get() ? 0.05f * (level - 1) : 0); projectile.setRGB(ammoPerk.rgb); @@ -229,29 +229,29 @@ public class GunEventHandler { projectile.bypassArmorRate(bypassArmorRate); if (perk == ModPerks.SILVER_BULLET.get()) { - int level = PerkHelper.getItemPerkLevel(perk, heldItem); + int level = PerkHelper.getItemPerkLevel(perk, stack); projectile.undeadMultiple(1.0f + 0.5f * level); } else if (perk == ModPerks.BEAST_BULLET.get()) { projectile.beast(); } else if (perk == ModPerks.JHP_BULLET.get()) { - int level = PerkHelper.getItemPerkLevel(perk, heldItem); + int level = PerkHelper.getItemPerkLevel(perk, stack); projectile.jhpBullet(true, level); } else if (perk == ModPerks.HE_BULLET.get()) { - int level = PerkHelper.getItemPerkLevel(perk, heldItem); + int level = PerkHelper.getItemPerkLevel(perk, stack); projectile.heBullet(true, level); } else if (perk == ModPerks.INCENDIARY_BULLET.get()) { - int level = PerkHelper.getItemPerkLevel(perk, heldItem); - projectile.fireBullet(true, level, heldItem.is(ModTags.Items.SHOTGUN)); + int level = PerkHelper.getItemPerkLevel(perk, stack); + projectile.fireBullet(true, level, stack.is(ModTags.Items.SHOTGUN)); } - var dmgPerk = PerkHelper.getPerkByType(heldItem, Perk.Type.DAMAGE); + var dmgPerk = PerkHelper.getPerkByType(stack, Perk.Type.DAMAGE); if (dmgPerk == ModPerks.MONSTER_HUNTER.get()) { - int level = PerkHelper.getItemPerkLevel(dmgPerk, heldItem); + int level = PerkHelper.getItemPerkLevel(dmgPerk, stack); projectile.monsterMultiple(0.1f + 0.1f * level); } projectile.setPos(player.getX() - 0.1 * player.getLookAngle().x, player.getEyeY() - 0.1 - 0.1 * player.getLookAngle().y, player.getZ() + -0.1 * player.getLookAngle().z); - projectile.shoot(player, player.getLookAngle().x, player.getLookAngle().y + 0.001f, player.getLookAngle().z, heldItem.is(ModTags.Items.SHOTGUN) && perk == ModPerks.INCENDIARY_BULLET.get() ? 4.5f : velocity, + projectile.shoot(player, player.getLookAngle().x, player.getLookAngle().y + 0.001f, player.getLookAngle().z, stack.is(ModTags.Items.SHOTGUN) && perk == ModPerks.INCENDIARY_BULLET.get() ? 4.5f : velocity, (float) spared); player.level().addFreshEntity(projectile); } 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 7502df3b2..24d9256a6 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 @@ -276,12 +276,12 @@ public class Trachelium extends GunItem implements GeoItem, AnimatedItem { if (scopeType > 0 || gripType > 0) { tag.putDouble("CustomVelocity", 15); - tag.putDouble("BypassesArmor", 0.4); + GunsTool.setGunDoubleTag(stack, "BypassesArmor", 0.4); GunsTool.setGunDoubleTag(stack, "Damage", 21); GunsTool.setGunDoubleTag(stack, "Headshot", 2.5); } else { tag.putDouble("CustomVelocity", 0); - tag.putDouble("BypassesArmor", 0.3); + GunsTool.setGunDoubleTag(stack, "BypassesArmor", 0.3); GunsTool.setGunDoubleTag(stack, "Damage", 19); GunsTool.setGunDoubleTag(stack, "Headshot", 2); } diff --git a/src/main/java/com/atsuishio/superbwarfare/network/message/FireMessage.java b/src/main/java/com/atsuishio/superbwarfare/network/message/FireMessage.java index f957a6112..96db47120 100644 --- a/src/main/java/com/atsuishio/superbwarfare/network/message/FireMessage.java +++ b/src/main/java/com/atsuishio/superbwarfare/network/message/FireMessage.java @@ -232,27 +232,25 @@ public class FireMessage { } private static void spawnBullet(Player player) { - ItemStack heldItem = player.getMainHandItem(); - + ItemStack stack = player.getMainHandItem(); if (player.level().isClientSide()) return; - CompoundTag tag = heldItem.getOrCreateTag(); - var perk = PerkHelper.getPerkByType(heldItem, Perk.Type.AMMO); - float headshot = (float) GunsTool.getGunDoubleTag(heldItem, "Headshot", 0); - float velocity = 2 * (float) tag.getDouble("speed") * (float) perkSpeed(heldItem); - float bypassArmorRate = (float) heldItem.getOrCreateTag().getDouble("BypassesArmor"); + CompoundTag tag = stack.getOrCreateTag(); + var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); + float headshot = (float) GunsTool.getGunDoubleTag(stack, "Headshot", 0); + float velocity = 2 * (float) tag.getDouble("speed") * (float) perkSpeed(stack); + float bypassArmorRate = (float) GunsTool.getGunDoubleTag(stack, "BypassesArmor", 0); double damage; boolean zoom = player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables()).zoom; float spread; - if ((player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables())).zoom) { spread = 0.01f; - damage = 0.08333333 * GunsTool.getGunDoubleTag(heldItem, "Damage", 0) * tag.getDouble("speed") * perkDamage(heldItem); + damage = 0.08333333 * GunsTool.getGunDoubleTag(stack, "Damage", 0) * tag.getDouble("speed") * 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(heldItem, "Damage", 0) * tag.getDouble("speed") * perkDamage(heldItem); + GunsTool.getGunDoubleTag(stack, "Damage", 0) * tag.getDouble("speed") * perkDamage(stack); } ProjectileEntity projectile = new ProjectileEntity(player.level()) @@ -261,7 +259,7 @@ public class FireMessage { .zoom(zoom); if (perk instanceof AmmoPerk ammoPerk) { - int level = PerkHelper.getItemPerkLevel(perk, heldItem); + int level = PerkHelper.getItemPerkLevel(perk, stack); bypassArmorRate += ammoPerk.bypassArmorRate + (perk == ModPerks.AP_BULLET.get() ? 0.05f * (level - 1) : 0); projectile.setRGB(ammoPerk.rgb); @@ -279,24 +277,24 @@ public class FireMessage { projectile.bypassArmorRate(bypassArmorRate); if (perk == ModPerks.SILVER_BULLET.get()) { - int level = PerkHelper.getItemPerkLevel(perk, heldItem); + int level = PerkHelper.getItemPerkLevel(perk, stack); projectile.undeadMultiple(1.0f + 0.5f * level); } else if (perk == ModPerks.BEAST_BULLET.get()) { projectile.beast(); } else if (perk == ModPerks.JHP_BULLET.get()) { - int level = PerkHelper.getItemPerkLevel(perk, heldItem); + int level = PerkHelper.getItemPerkLevel(perk, stack); projectile.jhpBullet(true, level); } else if (perk == ModPerks.HE_BULLET.get()) { - int level = PerkHelper.getItemPerkLevel(perk, heldItem); + int level = PerkHelper.getItemPerkLevel(perk, stack); projectile.heBullet(true, level); } else if (perk == ModPerks.INCENDIARY_BULLET.get()) { - int level = PerkHelper.getItemPerkLevel(perk, heldItem); + int level = PerkHelper.getItemPerkLevel(perk, stack); projectile.fireBullet(true, level, !zoom); } - var dmgPerk = PerkHelper.getPerkByType(heldItem, Perk.Type.DAMAGE); + var dmgPerk = PerkHelper.getPerkByType(stack, Perk.Type.DAMAGE); if (dmgPerk == ModPerks.MONSTER_HUNTER.get()) { - int perkLevel = PerkHelper.getItemPerkLevel(dmgPerk, heldItem); + int perkLevel = PerkHelper.getItemPerkLevel(dmgPerk, stack); projectile.monsterMultiple(0.1f + 0.1f * perkLevel); } diff --git a/src/main/java/com/atsuishio/superbwarfare/tools/GunsTool.java b/src/main/java/com/atsuishio/superbwarfare/tools/GunsTool.java index 254b83dbe..9751c9c5e 100644 --- a/src/main/java/com/atsuishio/superbwarfare/tools/GunsTool.java +++ b/src/main/java/com/atsuishio/superbwarfare/tools/GunsTool.java @@ -55,7 +55,7 @@ public class GunsTool { // TODO 临时使用,移植完毕后删除 private static final Set STRING_SET = Set.of("EmptyReloadTime", "FireMode", "Weight", "SoundRadius", "BurstSize", "ProjectileAmount", - "Spread", "NormalReloadTime", "Headshot", "Semi", "Burst", "Auto", "RecoilX", "RecoilY", "Velocity", "Damage"); + "Spread", "NormalReloadTime", "Headshot", "Semi", "Burst", "Auto", "RecoilX", "RecoilY", "Velocity", "Damage", "BypassesArmor"); public static void initGun(Level level, ItemStack stack, String location) { if (level.getServer() == null) return;