优化NBT#BypassesArmor

This commit is contained in:
17146 2024-12-24 15:45:34 +08:00
parent ec4e956572
commit 9b5d17c304
5 changed files with 37 additions and 39 deletions

View file

@ -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))

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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);
}

View file

@ -55,7 +55,7 @@ public class GunsTool {
// TODO 临时使用移植完毕后删除
private static final Set<String> 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;