diff --git a/src/main/java/net/mcreator/superbwarfare/client/screens/CrossHairOverlay.java b/src/main/java/net/mcreator/superbwarfare/client/screens/CrossHairOverlay.java index 2a427e420..8b804204e 100644 --- a/src/main/java/net/mcreator/superbwarfare/client/screens/CrossHairOverlay.java +++ b/src/main/java/net/mcreator/superbwarfare/client/screens/CrossHairOverlay.java @@ -7,6 +7,9 @@ import net.mcreator.superbwarfare.config.client.DisplayConfig; import net.mcreator.superbwarfare.event.ClientEventHandler; import net.mcreator.superbwarfare.init.ModItems; import net.mcreator.superbwarfare.init.ModTags; +import net.mcreator.superbwarfare.perk.AmmoPerk; +import net.mcreator.superbwarfare.perk.Perk; +import net.mcreator.superbwarfare.perk.PerkHelper; import net.minecraft.client.CameraType; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; @@ -53,6 +56,7 @@ public class CrossHairOverlay { float deltaFrame = Minecraft.getInstance().getDeltaFrameTime(); float moveX = 0; float moveY = 0; + var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); if (DisplayConfig.FLOAT_CROSS_HAIR.get()) { moveX = (float) (-6 * ClientEventHandler.turnRot[1] - (player.isSprinting() ? 10 : 6) * ClientEventHandler.movePosX); @@ -77,12 +81,13 @@ public class CrossHairOverlay { preciseBlit(guiGraphics, ModUtils.loc("textures/screens/point.png"), w / 2f - 7.5f + moveX, h / 2f - 7.5f + moveY, 0, 0, 16, 16, 16, 16); if (!player.isSprinting() || player.getPersistentData().getDouble("noRun") > 0) { if (stack.is(ModTags.Items.SHOTGUN)) { - preciseBlit(guiGraphics, ModUtils.loc("textures/screens/shotgun_hud.png"), finPosX, finPosY, 0, 0.0F, finLength, finLength, finLength, finLength); + if (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug) { + normalCrossHair(guiGraphics, w ,h , spread, moveX, moveY); + } else { + shotgunCrossHair(guiGraphics, finPosX, finPosY, finLength); + } } else { - preciseBlit(guiGraphics, REX_HORIZONTAL, (float) (w / 2f - 13.5f - 2.8f * spread) + moveX, h / 2f - 7.5f + moveY, 0, 0, 16, 16, 16, 16); - preciseBlit(guiGraphics, REX_HORIZONTAL, (float) (w / 2f - 2.5f + 2.8f * spread) + moveX, h / 2f - 7.5f + moveY, 0, 0, 16, 16, 16, 16); - preciseBlit(guiGraphics, REX_VERTICAL, w / 2f - 7.5f + moveX, (float) (h / 2f - 2.5f + 2.8f * spread) + moveY, 0, 0, 16, 16, 16, 16); - preciseBlit(guiGraphics, REX_VERTICAL, w / 2f - 7.5f + moveX, (float) (h / 2f - 13.5f - 2.8f * spread) + moveY, 0, 0, 16, 16, 16, 16); + normalCrossHair(guiGraphics, w ,h , spread, moveX, moveY); } } } @@ -92,17 +97,20 @@ public class CrossHairOverlay { preciseBlit(guiGraphics, ModUtils.loc("textures/screens/point.png"), w / 2f - 7.5f + moveX, h / 2f - 7.5f + moveY, 0, 0, 16, 16, 16, 16); if (!player.isSprinting() || player.getPersistentData().getDouble("noRun") > 0 || ClientEventHandler.pullPos > 0) { if (ClientEventHandler.zoomTime < 0.1) { - preciseBlit(guiGraphics, ModUtils.loc("textures/screens/shotgun_hud.png"), finPosX, finPosY, 0, 0.0F, finLength, finLength, finLength, finLength); + if (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug) { + normalCrossHair(guiGraphics, w ,h , spread, moveX, moveY); + } else { + shotgunCrossHair(guiGraphics, finPosX, finPosY, finLength); + } } else { - preciseBlit(guiGraphics, REX_HORIZONTAL, (float) (w / 2f - 13.5f - 2.8f * spread) + moveX, h / 2f - 7.5f + moveY, 0, 0, 16, 16, 16, 16); - preciseBlit(guiGraphics, REX_HORIZONTAL, (float) (w / 2f - 2.5f + 2.8f * spread) + moveX, h / 2f - 7.5f + moveY, 0, 0, 16, 16, 16, 16); - preciseBlit(guiGraphics, REX_VERTICAL, w / 2f - 7.5f + moveX, (float) (h / 2f - 2.5f + 2.8f * spread) + moveY, 0, 0, 16, 16, 16, 16); - preciseBlit(guiGraphics, REX_VERTICAL, w / 2f - 7.5f + moveX, (float) (h / 2f - 13.5f - 2.8f * spread) + moveY, 0, 0, 16, 16, 16, 16); + normalCrossHair(guiGraphics, w ,h , spread, moveX, moveY); } } } } + + // 在开启伤害指示器时才进行渲染 if (DisplayConfig.KILL_INDICATION.get()) { renderKillIndicator(guiGraphics, w, h, moveX, moveY); @@ -125,6 +133,17 @@ public class CrossHairOverlay { } + private static void normalCrossHair(GuiGraphics guiGraphics, int w, int h, double spread, float moveX, float moveY ) { + preciseBlit(guiGraphics, REX_HORIZONTAL, (float) (w / 2f - 13.5f - 2.8f * spread) + moveX, h / 2f - 7.5f + moveY, 0, 0, 16, 16, 16, 16); + preciseBlit(guiGraphics, REX_HORIZONTAL, (float) (w / 2f - 2.5f + 2.8f * spread) + moveX, h / 2f - 7.5f + moveY, 0, 0, 16, 16, 16, 16); + preciseBlit(guiGraphics, REX_VERTICAL, w / 2f - 7.5f + moveX, (float) (h / 2f - 2.5f + 2.8f * spread) + moveY, 0, 0, 16, 16, 16, 16); + preciseBlit(guiGraphics, REX_VERTICAL, w / 2f - 7.5f + moveX, (float) (h / 2f - 13.5f - 2.8f * spread) + moveY, 0, 0, 16, 16, 16, 16); + } + + private static void shotgunCrossHair(GuiGraphics guiGraphics, float finPosX, float finPosY, float finLength) { + preciseBlit(guiGraphics, ModUtils.loc("textures/screens/shotgun_hud.png"), finPosX, finPosY, 0, 0.0F, finLength, finLength, finLength, finLength); + } + private static boolean shouldRenderCrossHair(Player player) { if (player == null) return false; diff --git a/src/main/java/net/mcreator/superbwarfare/entity/projectile/ProjectileEntity.java b/src/main/java/net/mcreator/superbwarfare/entity/projectile/ProjectileEntity.java index a42a96641..246a31999 100644 --- a/src/main/java/net/mcreator/superbwarfare/entity/projectile/ProjectileEntity.java +++ b/src/main/java/net/mcreator/superbwarfare/entity/projectile/ProjectileEntity.java @@ -340,7 +340,7 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa this.onHitBlock(hitVec); if (heBullet) { - explosionBulletBlock(this, damage, heLevel, monsterMultiple + 1, hitVec); + explosionBulletBlock(this, this.damage, heLevel, monsterMultiple + 1, hitVec); } } @@ -363,8 +363,8 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa protected void explosionBulletBlock(Entity projectile , float damage, int heLevel, float monsterMultiple, Vec3 hitVec) { CustomExplosion explosion = new CustomExplosion(projectile.level(), projectile, - ModDamageTypes.causeProjectileBoomDamage(projectile.level().registryAccess(), projectile, this.getShooter()), (float) ((2 + 0.1 * damage) * (1 + 0.1 * heLevel)), - hitVec.x, hitVec.y, hitVec.z, (float)((2.5 + 0.01 * damage) * (1 + 0.05 * heLevel)) , Explosion.BlockInteraction.KEEP).setDamageMultiplier(monsterMultiple); + ModDamageTypes.causeProjectileBoomDamage(projectile.level().registryAccess(), projectile, this.getShooter()), (float) ((0.9 * damage) * (1 + 0.1 * heLevel)), + hitVec.x, hitVec.y, hitVec.z, (float)((1.5 + 0.02 * damage) * (1 + 0.05 * heLevel)) , Explosion.BlockInteraction.KEEP).setDamageMultiplier(monsterMultiple); explosion.explode(); net.minecraftforge.event.ForgeEventFactory.onExplosionStart(projectile.level(), explosion); explosion.finalizeExplosion(false); @@ -502,7 +502,7 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa } if (heBullet) { - explosionBulletEntity(this, entity, damage, heLevel, mMultiple); + explosionBulletEntity(this, entity, this.damage, heLevel, mMultiple); } if (headshot) { @@ -546,8 +546,8 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa protected void explosionBulletEntity(Entity projectile, Entity target, float damage, int heLevel, float monsterMultiple) { CustomExplosion explosion = new CustomExplosion(projectile.level(), projectile, - ModDamageTypes.causeProjectileBoomDamage(projectile.level().registryAccess(), projectile, this.getShooter()), (float) ((2 + 0.1 * damage) * (1 + 0.1 * heLevel)), - target.getX(), target.getY(), target.getZ(), (float)((2.5 + 0.01 * damage) * (1 + 0.05 * heLevel)) , Explosion.BlockInteraction.KEEP).setDamageMultiplier(monsterMultiple); + ModDamageTypes.causeProjectileBoomDamage(projectile.level().registryAccess(), projectile, this.getShooter()), (float) ((0.8 * damage) * (1 + 0.1 * heLevel)), + target.getX(), target.getY(), target.getZ(), (float)((1.5 + 0.02 * damage) * (1 + 0.05 * heLevel)) , Explosion.BlockInteraction.KEEP).setDamageMultiplier(monsterMultiple); explosion.explode(); net.minecraftforge.event.ForgeEventFactory.onExplosionStart(projectile.level(), explosion); explosion.finalizeExplosion(false); diff --git a/src/main/java/net/mcreator/superbwarfare/event/ClientEventHandler.java b/src/main/java/net/mcreator/superbwarfare/event/ClientEventHandler.java index 1217166f1..f0376a292 100644 --- a/src/main/java/net/mcreator/superbwarfare/event/ClientEventHandler.java +++ b/src/main/java/net/mcreator/superbwarfare/event/ClientEventHandler.java @@ -6,10 +6,10 @@ import net.mcreator.superbwarfare.entity.DroneEntity; import net.mcreator.superbwarfare.entity.ICannonEntity; import net.mcreator.superbwarfare.init.ModItems; import net.mcreator.superbwarfare.init.ModMobEffects; -import net.mcreator.superbwarfare.init.ModPerks; import net.mcreator.superbwarfare.init.ModTags; import net.mcreator.superbwarfare.network.ModVariables; import net.mcreator.superbwarfare.network.message.ShootMessage; +import net.mcreator.superbwarfare.perk.AmmoPerk; import net.mcreator.superbwarfare.perk.Perk; import net.mcreator.superbwarfare.perk.PerkHelper; import net.mcreator.superbwarfare.tools.MillisTimer; @@ -162,7 +162,7 @@ public class ClientEventHandler { if (stack.is(ModTags.Items.SNIPER_RIFLE)) { zoomSpread = 1 - (0.995 * zoomTime); } else if (stack.is(ModTags.Items.SHOTGUN)) { - if (perk == ModPerks.HE_BULLET.get()) { + if (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug) { zoomSpread = 1 - (0.85 * zoomTime); } else { zoomSpread = 1 - (0.25 * zoomTime); @@ -456,7 +456,7 @@ public class ClientEventHandler { private static void handleWeaponZoom(LivingEntity entity) { if (!(entity instanceof Player player)) return; float times = 5 * Minecraft.getInstance().getDeltaFrameTime(); - if (GLFW.glfwGetMouseButton(Minecraft.getInstance().getWindow().getWindow(), GLFW.GLFW_MOUSE_BUTTON_RIGHT) == GLFW.GLFW_PRESS && !notInGame() && !player.getCooldowns().isOnCooldown(player.getMainHandItem().getItem())) { + if (GLFW.glfwGetMouseButton(Minecraft.getInstance().getWindow().getWindow(), GLFW.GLFW_MOUSE_BUTTON_RIGHT) == GLFW.GLFW_PRESS && !notInGame()) { zoomTime = Mth.clamp(zoomTime + 0.03 * times, 0, 1); } else { zoomTime = Mth.clamp(zoomTime - 0.04 * times, 0, 1); diff --git a/src/main/java/net/mcreator/superbwarfare/event/GunEventHandler.java b/src/main/java/net/mcreator/superbwarfare/event/GunEventHandler.java index ea153176d..f1a31d551 100644 --- a/src/main/java/net/mcreator/superbwarfare/event/GunEventHandler.java +++ b/src/main/java/net/mcreator/superbwarfare/event/GunEventHandler.java @@ -194,19 +194,19 @@ public class GunEventHandler { if (!player.level().isClientSide()) { float headshot = (float) heldItem.getOrCreateTag().getDouble("headshot"); - float damage = (float) (heldItem.getOrCreateTag().getDouble("damage") + heldItem.getOrCreateTag().getDouble("sentinelChargeDamage")) * (float) heldItem.getOrCreateTag().getDouble("levelDamageMultiple"); - float velocity = (float) heldItem.getOrCreateTag().getDouble("velocity"); + float damage = (float) (heldItem.getOrCreateTag().getDouble("damage") + heldItem.getOrCreateTag().getDouble("sentinelChargeDamage")) * (float) heldItem.getOrCreateTag().getDouble("levelDamageMultiple") * (float) perkDamage(heldItem); + float velocity = (float) heldItem.getOrCreateTag().getDouble("velocity") * (float) perkSpeed(heldItem); + int projectileAmount = (int) heldItem.getOrCreateTag().getDouble("projectile_amount"); + float bypassArmorRate = (float) heldItem.getOrCreateTag().getDouble("BypassesArmor"); boolean zoom = player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables()).zoom; var perk = PerkHelper.getPerkByType(heldItem, Perk.Type.AMMO); ProjectileEntity projectile = new ProjectileEntity(player.level()) .shooter(player) - .damage((perk == ModPerks.HE_BULLET.get() ? (int)heldItem.getOrCreateTag().getDouble("projectile_amount") * damage : damage)) + .damage(perk instanceof AmmoPerk ammoPerk && ammoPerk.slug ? projectileAmount * damage : damage) .headShot(headshot) .zoom(zoom); - float bypassArmorRate = (float) heldItem.getOrCreateTag().getDouble("BypassesArmor"); - if (perk instanceof AmmoPerk ammoPerk) { int level = PerkHelper.getItemPerkLevel(perk, heldItem); @@ -239,7 +239,6 @@ public class GunEventHandler { } else if (perk == ModPerks.HE_BULLET.get()) { int level = PerkHelper.getItemPerkLevel(perk, heldItem); projectile.heBullet(true, level); - velocity *= 0.6f; } var dmgPerk = PerkHelper.getPerkByType(heldItem, Perk.Type.DAMAGE); @@ -255,6 +254,22 @@ public class GunEventHandler { } } + public static double perkDamage(ItemStack stack) { + var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); + if (perk instanceof AmmoPerk ammoPerk) { + return ammoPerk.damageRate; + } + return 1; + } + + public static double perkSpeed(ItemStack stack) { + var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); + if (perk instanceof AmmoPerk ammoPerk) { + return ammoPerk.speedRate; + } + return 1; + } + /** * 通用的武器换弹流程 */ diff --git a/src/main/java/net/mcreator/superbwarfare/event/LivingEventHandler.java b/src/main/java/net/mcreator/superbwarfare/event/LivingEventHandler.java index 513af716f..79fb228b1 100644 --- a/src/main/java/net/mcreator/superbwarfare/event/LivingEventHandler.java +++ b/src/main/java/net/mcreator/superbwarfare/event/LivingEventHandler.java @@ -9,6 +9,8 @@ import net.mcreator.superbwarfare.item.gun.GunItem; import net.mcreator.superbwarfare.network.ModVariables; import net.mcreator.superbwarfare.network.message.ClientIndicatorMessage; import net.mcreator.superbwarfare.network.message.PlayerGunKillMessage; +import net.mcreator.superbwarfare.perk.AmmoPerk; +import net.mcreator.superbwarfare.perk.Perk; import net.mcreator.superbwarfare.perk.PerkHelper; import net.mcreator.superbwarfare.tools.DamageTypeTool; import net.mcreator.superbwarfare.tools.SoundTool; @@ -117,21 +119,26 @@ public class LivingEventHandler { double damage = amount; ItemStack stack = sourceEntity instanceof LivingEntity living ? living.getMainHandItem() : ItemStack.EMPTY; + var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); //距离衰减 if (DamageTypeTool.isGunDamage(source)) { double distance = entity.position().distanceTo(sourceEntity.position()); if (stack.is(ModTags.Items.USE_SHOTGUN_AMMO)) { - damage = reduceDamageByDistance(amount, distance, 0.03, 25); + if (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug) { + damage = reduceDamageByDistance(amount, distance, 0.015, 50); + } else { + damage = reduceDamageByDistance(amount, distance, 0.03, 25); + } } else if (stack.is(ModTags.Items.USE_SNIPER_AMMO)) { - damage = reduceDamageByDistance(amount, distance, 0.001, 200); + damage = reduceDamageByDistance(amount, distance, 0.001, 150); } else if (stack.is(ModTags.Items.USE_HANDGUN_AMMO)) { - damage = reduceDamageByDistance(amount, distance, 0.03, 50); + damage = reduceDamageByDistance(amount, distance, 0.02, 50); } else if (stack.is(ModTags.Items.SMG)) { - damage = reduceDamageByDistance(amount, distance, 0.03, 50); + damage = reduceDamageByDistance(amount, distance, 0.02, 50); } else if (stack.is(ModTags.Items.USE_RIFLE_AMMO) || stack.getItem() == ModItems.BOCEK.get()) { - damage = reduceDamageByDistance(amount, distance, 0.0025, 150); + damage = reduceDamageByDistance(amount, distance, 0.007, 100); } } @@ -159,7 +166,7 @@ public class LivingEventHandler { event.setAmount((float) damage); if (entity instanceof TargetEntity && sourceEntity instanceof Player player) { - player.displayClientMessage(Component.literal("Damage:" + new DecimalFormat("##.#").format(damage) + + player.displayClientMessage(Component.literal("Damage:" + new DecimalFormat("##.##").format(damage) + " Distance:" + new DecimalFormat("##.#").format(entity.position().distanceTo(sourceEntity.position())) + "M"), false); } } diff --git a/src/main/java/net/mcreator/superbwarfare/init/ModPerks.java b/src/main/java/net/mcreator/superbwarfare/init/ModPerks.java index 821f9733a..165975049 100644 --- a/src/main/java/net/mcreator/superbwarfare/init/ModPerks.java +++ b/src/main/java/net/mcreator/superbwarfare/init/ModPerks.java @@ -29,15 +29,15 @@ public class ModPerks { public static final DeferredRegister AMMO_PERKS = DeferredRegister.create(new ResourceLocation(ModUtils.MODID, "perk"), ModUtils.MODID); public static final RegistryObject AP_BULLET = AMMO_PERKS.register("ap_bullet", - () -> new AmmoPerk(new AmmoPerk.Builder("ap_bullet", Perk.Type.AMMO).bypassArmorRate(0.4f).rgb(230, 70, 35))); + () -> new AmmoPerk(new AmmoPerk.Builder("ap_bullet", Perk.Type.AMMO).bypassArmorRate(0.4f).damageRate(0.9f).speedRate(1.2f).slug(true).rgb(230, 70, 35))); public static final RegistryObject JHP_BULLET = AMMO_PERKS.register("jhp_bullet", - () -> new AmmoPerk(new AmmoPerk.Builder("jhp_bullet", Perk.Type.AMMO).bypassArmorRate(-0.2f).rgb(230, 131, 65))); + () -> new AmmoPerk(new AmmoPerk.Builder("jhp_bullet", Perk.Type.AMMO).bypassArmorRate(-0.2f).damageRate(1.1f).speedRate(0.9f).slug(true).rgb(230, 131, 65))); public static final RegistryObject HE_BULLET = AMMO_PERKS.register("he_bullet", - () -> new AmmoPerk(new AmmoPerk.Builder("he_bullet", Perk.Type.AMMO).bypassArmorRate(-0.3f).rgb(240, 20, 10))); + () -> new AmmoPerk(new AmmoPerk.Builder("he_bullet", Perk.Type.AMMO).bypassArmorRate(-0.3f).damageRate(0.5f).speedRate(0.6f).slug(true).rgb(240, 20, 10))); public static final RegistryObject SILVER_BULLET = AMMO_PERKS.register("silver_bullet", - () -> new AmmoPerk(new AmmoPerk.Builder("silver_bullet", Perk.Type.AMMO).bypassArmorRate(0.05f).rgb(87, 166, 219))); + () -> new AmmoPerk(new AmmoPerk.Builder("silver_bullet", Perk.Type.AMMO).bypassArmorRate(0.05f).damageRate(0.8f).speedRate(1.1f).rgb(87, 166, 219))); public static final RegistryObject POISONOUS_BULLET = AMMO_PERKS.register("poisonous_bullet", - () -> new AmmoPerk(new AmmoPerk.Builder("poisonous_bullet", Perk.Type.AMMO).bypassArmorRate(0.0f).rgb(48, 131, 6) + () -> new AmmoPerk(new AmmoPerk.Builder("poisonous_bullet", Perk.Type.AMMO).bypassArmorRate(0.0f).damageRate(1.0f).speedRate(1.0f).rgb(48, 131, 6) .mobEffect(() -> MobEffects.POISON))); public static final RegistryObject BEAST_BULLET = AMMO_PERKS.register("beast_bullet", () -> new AmmoPerk(new AmmoPerk.Builder("beast_bullet", Perk.Type.AMMO).bypassArmorRate(0.0f).rgb(134, 65, 14))); @@ -69,11 +69,11 @@ public class ModPerks { public static void registerCompatPerks() { if (ModList.get().isLoaded(CompatHolder.DMV)) { AMMO_PERKS.register("blade_bullet", () -> new AmmoPerk(new AmmoPerk.Builder("blade_bullet", Perk.Type.AMMO) - .bypassArmorRate(-0.2f).rgb(0xB4, 0x4B, 0x88).mobEffect(() -> CompatHolder.DMV_BLEEDING))); + .bypassArmorRate(-0.2f).damageRate(0.7f).speedRate(0.8f).rgb(0xB4, 0x4B, 0x88).mobEffect(() -> CompatHolder.DMV_BLEEDING))); } if (ModList.get().isLoaded(CompatHolder.VRC)) { AMMO_PERKS.register("curse_flame_bullet", () -> new AmmoPerk(new AmmoPerk.Builder("curse_flame_bullet", Perk.Type.AMMO) - .bypassArmorRate(0.0f).rgb(0xB1, 0xC1, 0xF2).mobEffect(() -> CompatHolder.VRC_CURSE_FLAME))); + .bypassArmorRate(0.0f).damageRate(1.2f).speedRate(0.9f).rgb(0xB1, 0xC1, 0xF2).mobEffect(() -> CompatHolder.VRC_CURSE_FLAME))); } } diff --git a/src/main/java/net/mcreator/superbwarfare/item/PerkItem.java b/src/main/java/net/mcreator/superbwarfare/item/PerkItem.java index 3b791b243..70da7ffb8 100644 --- a/src/main/java/net/mcreator/superbwarfare/item/PerkItem.java +++ b/src/main/java/net/mcreator/superbwarfare/item/PerkItem.java @@ -1,5 +1,6 @@ package net.mcreator.superbwarfare.item; +import net.mcreator.superbwarfare.perk.AmmoPerk; import net.mcreator.superbwarfare.perk.Perk; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; @@ -42,5 +43,22 @@ public class PerkItem extends Item { tooltips.add(Component.literal("")); tooltips.add(Component.translatable("perk.superbwarfare.slot").withStyle(ChatFormatting.GOLD) .append(Component.translatable("perk.superbwarfare.slot_" + this.getPerk().type.getName()).withStyle(chatFormatting))); + if (this.getPerk() instanceof AmmoPerk ammoPerk) { + if (ammoPerk.damageRate < 1) { + tooltips.add(Component.translatable("des.superbwarfare.perk_damage_reduce").withStyle(ChatFormatting.RED)); + } else if (ammoPerk.damageRate > 1) { + tooltips.add(Component.translatable("des.superbwarfare.perk_damage_plus").withStyle(ChatFormatting.GREEN)); + } + + if (ammoPerk.speedRate < 1) { + tooltips.add(Component.translatable("des.superbwarfare.perk_speed_reduce").withStyle(ChatFormatting.RED)); + } else if (ammoPerk.speedRate > 1) { + tooltips.add(Component.translatable("des.superbwarfare.perk_speed_plus").withStyle(ChatFormatting.GREEN)); + } + + if (ammoPerk.slug) { + tooltips.add(Component.translatable("des.superbwarfare.perk_slug").withStyle(ChatFormatting.YELLOW)); + } + } } } diff --git a/src/main/java/net/mcreator/superbwarfare/network/message/FireMessage.java b/src/main/java/net/mcreator/superbwarfare/network/message/FireMessage.java index 6f7005f05..3b5ebaf14 100644 --- a/src/main/java/net/mcreator/superbwarfare/network/message/FireMessage.java +++ b/src/main/java/net/mcreator/superbwarfare/network/message/FireMessage.java @@ -174,10 +174,27 @@ public class FireMessage { } } - private static void handleBowShoot(Player player) { - ItemStack stack = player.getMainHandItem(); + public static double perkDamage(ItemStack stack) { + var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); + if (perk instanceof AmmoPerk ammoPerk) { + return ammoPerk.damageRate; + } + return 1; + } - double power = stack.getOrCreateTag().getDouble("power"); + public static double perkSpeed(ItemStack stack) { + var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); + if (perk instanceof AmmoPerk ammoPerk) { + return ammoPerk.speedRate; + } + return 1; + } + + private static void handleBowShoot(Player player) { + if (player.level().isClientSide()) return; + + ItemStack stack = player.getMainHandItem(); + var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); if (player instanceof ServerPlayer serverPlayer) { SoundTool.stopSound(serverPlayer, ModSounds.BOCEK_PULL_1P.getId(), SoundSource.PLAYERS); @@ -187,97 +204,23 @@ public class FireMessage { if (stack.getOrCreateTag().getDouble("power") >= 6) { stack.getOrCreateTag().putDouble("speed", stack.getOrCreateTag().getDouble("power")); if ((player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables())).zoom) { - Level plevel = player.level(); - if (!plevel.isClientSide()) { - ItemStack heldItem = player.getMainHandItem(); - if (player.level().isClientSide()) return; + spawnBullet(player); + spawnFakeArrow(player); - CompoundTag tag = heldItem.getOrCreateTag(); - double damage; - float headshot = (float) tag.getDouble("headshot"); - float velocity = 2 * (float) tag.getDouble("speed"); - boolean zoom = player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables()).zoom; - float bypassArmorRate = (float) heldItem.getOrCreateTag().getDouble("BypassesArmor"); + SoundTool.playLocalSound(player, ModSounds.BOCEK_ZOOM_FIRE_1P.get(), 10, 1); + player.playSound(ModSounds.BOCEK_ZOOM_FIRE_3P.get(), 2, 1); - ProjectileEntity projectile = new ProjectileEntity(player.level()) - .shooter(player) - .headShot(headshot) - .zoom(zoom); - - var perk = PerkHelper.getPerkByType(heldItem, Perk.Type.AMMO); - if (perk instanceof AmmoPerk ammoPerk) { - int level = PerkHelper.getItemPerkLevel(perk, heldItem); - - bypassArmorRate += ammoPerk.bypassArmorRate + (perk == ModPerks.AP_BULLET.get() ? 0.05f * (level - 1) : 0); - projectile.setRGB(ammoPerk.rgb); - - if (ammoPerk.mobEffect.get() != null) { - projectile.effect(() -> new MobEffectInstance(ammoPerk.mobEffect.get(), 70 + 30 * level, level - 1)); - } - } - - bypassArmorRate = Math.max(bypassArmorRate, 0); - projectile.bypassArmorRate(bypassArmorRate); - - if (perk == ModPerks.SILVER_BULLET.get()) { - int level = PerkHelper.getItemPerkLevel(perk, heldItem); - 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); - projectile.jhpBullet(true, level); - } else if (perk == ModPerks.HE_BULLET.get()) { - int level = PerkHelper.getItemPerkLevel(perk, heldItem); - projectile.heBullet(true, level); - velocity *= 0.6f; - } - - var dmgPerk = PerkHelper.getPerkByType(heldItem, Perk.Type.DAMAGE); - if (dmgPerk == ModPerks.MONSTER_HUNTER.get()) { - int perkLevel = PerkHelper.getItemPerkLevel(dmgPerk, heldItem); - projectile.monsterMultiple(0.1f + 0.1f * perkLevel); - } - - 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); - - damage = 0.08333333 * tag.getDouble("damage") * tag.getDouble("speed") * tag.getDouble("levelDamageMultiple"); - projectile.shoot(player.getLookAngle().x, player.getLookAngle().y, player.getLookAngle().z, velocity, 0); - projectile.damage((float) damage); - player.level().addFreshEntity(projectile); - - BocekArrowEntity arrow = new BocekArrowEntity(player, plevel); - arrow.setBaseDamage(0); - arrow.setKnockback(0); - arrow.setSilent(true); - arrow.setPierceLevel((byte) 2); - arrow.pickup = AbstractArrow.Pickup.DISALLOWED; - - arrow.setPos(player.getX(), player.getEyeY() - 0.1, player.getZ()); - arrow.shoot(player.getLookAngle().x, player.getLookAngle().y, player.getLookAngle().z, (float) (2 * power), 0); - plevel.addFreshEntity(arrow); - } - - if (!player.level().isClientSide()) { - SoundTool.playLocalSound(player, ModSounds.BOCEK_ZOOM_FIRE_1P.get(), 10, 1); - player.playSound(ModSounds.BOCEK_ZOOM_FIRE_3P.get(), 2, 1); - } } else { - var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); - for (int index0 = 0; index0 < (perk == ModPerks.HE_BULLET.get() ? 1 : 10); index0++) { + for (int index0 = 0; index0 < (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug ? 1 : 10); index0++) { spawnBullet(player); } - if (!player.level().isClientSide() && player.getServer() != null) { - SoundTool.playLocalSound(player, ModSounds.BOCEK_SHATTER_CAP_FIRE_1P.get(), 10, 1); - player.playSound(ModSounds.BOCEK_SHATTER_CAP_FIRE_3P.get(), 2, 1); - } + SoundTool.playLocalSound(player, ModSounds.BOCEK_SHATTER_CAP_FIRE_1P.get(), 10, 1); + player.playSound(ModSounds.BOCEK_SHATTER_CAP_FIRE_3P.get(), 2, 1); } - var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); - if (perk == ModPerks.BEAST_BULLET.get()) { player.playSound(ModSounds.HENG.get(), 4f, 1f); @@ -314,18 +257,30 @@ public class FireMessage { if (player.level().isClientSide()) return; CompoundTag tag = heldItem.getOrCreateTag(); - double damage; + var perk = PerkHelper.getPerkByType(heldItem, Perk.Type.AMMO); float headshot = (float) tag.getDouble("headshot"); - float velocity = 2 * (float) tag.getDouble("speed"); - boolean zoom = player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables()).zoom; + float velocity = 2 * (float) tag.getDouble("speed") * (float)perkSpeed(heldItem); float bypassArmorRate = (float) heldItem.getOrCreateTag().getDouble("BypassesArmor"); + 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 * tag.getDouble("damage") * tag.getDouble("speed") * tag.getDouble("levelDamageMultiple") * perkDamage(heldItem); + } else { + spread = perk instanceof AmmoPerk ammoPerk && ammoPerk.slug ? 1 : 2.5f; + damage = (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug ? 0.08333333 : 0.008333333) * tag.getDouble("damage") * tag.getDouble("speed") * tag.getDouble("levelDamageMultiple") * perkDamage(heldItem); + } ProjectileEntity projectile = new ProjectileEntity(player.level()) .shooter(player) .headShot(headshot) .zoom(zoom); - var perk = PerkHelper.getPerkByType(heldItem, Perk.Type.AMMO); + if (perk instanceof AmmoPerk ammoPerk) { int level = PerkHelper.getItemPerkLevel(perk, heldItem); @@ -351,7 +306,6 @@ public class FireMessage { } else if (perk == ModPerks.HE_BULLET.get()) { int level = PerkHelper.getItemPerkLevel(perk, heldItem); projectile.heBullet(true, level); - velocity *= 0.6f; } var dmgPerk = PerkHelper.getPerkByType(heldItem, Perk.Type.DAMAGE); @@ -362,12 +316,32 @@ public class FireMessage { 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); - damage = 0.008333333 * tag.getDouble("damage") * tag.getDouble("speed") * tag.getDouble("levelDamageMultiple"); - projectile.shoot(player.getLookAngle().x, player.getLookAngle().y, player.getLookAngle().z, velocity, 2.5f); - projectile.damage((float) (perk == ModPerks.HE_BULLET.get() ? 10 * damage : damage)); + projectile.shoot(player.getLookAngle().x, player.getLookAngle().y, player.getLookAngle().z, velocity, spread); + + projectile.damage((float) damage); + player.level().addFreshEntity(projectile); } + private static void spawnFakeArrow(Player player) { + + ItemStack heldItem = player.getMainHandItem(); + CompoundTag tag = heldItem.getOrCreateTag(); + + float velocity = 2 * (float) tag.getDouble("speed") * (float)perkSpeed(heldItem); + + BocekArrowEntity arrow = new BocekArrowEntity(player, player.level()); + arrow.setBaseDamage(0); + arrow.setKnockback(0); + arrow.setSilent(true); + arrow.setPierceLevel((byte) 2); + arrow.pickup = AbstractArrow.Pickup.DISALLOWED; + + arrow.setPos(player.getX(), player.getEyeY() - 0.1, player.getZ()); + arrow.shoot(player.getLookAngle().x, player.getLookAngle().y, player.getLookAngle().z, velocity, 0); + player.level().addFreshEntity(arrow); + } + private static void handleTaserFire(Player player) { if (player.isSpectator()) return; diff --git a/src/main/java/net/mcreator/superbwarfare/network/message/ShootMessage.java b/src/main/java/net/mcreator/superbwarfare/network/message/ShootMessage.java index ec41b2178..4e5b83fc8 100644 --- a/src/main/java/net/mcreator/superbwarfare/network/message/ShootMessage.java +++ b/src/main/java/net/mcreator/superbwarfare/network/message/ShootMessage.java @@ -6,6 +6,7 @@ import net.mcreator.superbwarfare.init.ModPerks; import net.mcreator.superbwarfare.init.ModSounds; import net.mcreator.superbwarfare.init.ModTags; import net.mcreator.superbwarfare.network.ModVariables; +import net.mcreator.superbwarfare.perk.AmmoPerk; import net.mcreator.superbwarfare.perk.Perk; import net.mcreator.superbwarfare.perk.PerkHelper; import net.mcreator.superbwarfare.tools.ParticleTool; @@ -67,6 +68,7 @@ public class ShootMessage { int coolDownTick = (int) Math.ceil(20 / (rpm / 60)); double mode = stack.getOrCreateTag().getInt("fire_mode"); + int projectileAmount = (int) stack.getOrCreateTag().getDouble("projectile_amount"); if (((player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables())).holdFire || stack.getOrCreateTag().getInt("burst_fire") > 0) && !(stack.getOrCreateTag().getBoolean("is_normal_reloading") || stack.getOrCreateTag().getBoolean("is_empty_reloading")) @@ -154,7 +156,7 @@ public class ShootMessage { var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); - for (int index0 = 0; index0 < (perk == ModPerks.HE_BULLET.get() ? 1 : (int) stack.getOrCreateTag().getDouble("projectile_amount")); index0++) { + for (int index0 = 0; index0 < (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug ? 1 : projectileAmount); index0++) { gunShoot(player, spared); } @@ -168,6 +170,8 @@ public class ShootMessage { } else if (stack.is(ModItems.MINIGUN.get())) { var tag = stack.getOrCreateTag(); + int projectileAmount = (int) tag.getDouble("projectile_amount"); + int count = 0; for (var inv : player.getInventory().items) { if (inv.is(ModItems.CREATIVE_AMMO_BOX.get())) { @@ -199,7 +203,7 @@ public class ShootMessage { } } - for (int index0 = 0; index0 < (perk == ModPerks.HE_BULLET.get() ? 1 : (int) stack.getOrCreateTag().getDouble("projectile_amount")); index0++) { + for (int index0 = 0; index0 < (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug ? 1 : projectileAmount); index0++) { gunShoot(player, spared); } diff --git a/src/main/java/net/mcreator/superbwarfare/perk/AmmoPerk.java b/src/main/java/net/mcreator/superbwarfare/perk/AmmoPerk.java index 7a0624ab8..031359979 100644 --- a/src/main/java/net/mcreator/superbwarfare/perk/AmmoPerk.java +++ b/src/main/java/net/mcreator/superbwarfare/perk/AmmoPerk.java @@ -7,12 +7,18 @@ import java.util.function.Supplier; public class AmmoPerk extends Perk { public float bypassArmorRate; + public float damageRate; + public float speedRate; + public boolean slug; public float[] rgb; public Supplier mobEffect; public AmmoPerk(AmmoPerk.Builder builder) { super(builder.descriptionId, builder.type); this.bypassArmorRate = builder.bypassArmorRate; + this.damageRate = builder.damageRate; + this.speedRate = builder.speedRate; + this.slug = builder.slug; this.rgb = builder.rgb; this.mobEffect = builder.mobEffect; } @@ -21,6 +27,9 @@ public class AmmoPerk extends Perk { String descriptionId; Type type; float bypassArmorRate = 0.0f; + float damageRate = 1.0f; + float speedRate = 1.0f; + boolean slug = false; float[] rgb = {1, 222 / 255f, 39 / 255f}; public Supplier mobEffect = () -> null; @@ -34,6 +43,21 @@ public class AmmoPerk extends Perk { return this; } + public AmmoPerk.Builder damageRate(float damageRate) { + this.damageRate = Mth.clamp(damageRate, 0, Float.POSITIVE_INFINITY); + return this; + } + + public AmmoPerk.Builder speedRate(float speedRate) { + this.speedRate = Mth.clamp(speedRate, 0, Float.POSITIVE_INFINITY); + return this; + } + + public AmmoPerk.Builder slug(boolean slug) { + this.slug = slug; + return this; + } + public AmmoPerk.Builder rgb(int r, int g, int b) { this.rgb[0] = r / 255f; this.rgb[1] = g / 255f; diff --git a/src/main/java/net/mcreator/superbwarfare/tools/CustomExplosion.java b/src/main/java/net/mcreator/superbwarfare/tools/CustomExplosion.java index 6120660f5..79b262803 100644 --- a/src/main/java/net/mcreator/superbwarfare/tools/CustomExplosion.java +++ b/src/main/java/net/mcreator/superbwarfare/tools/CustomExplosion.java @@ -148,9 +148,9 @@ public class CustomExplosion extends Explosion { double damageFinal = (damagePercent * damagePercent + damagePercent) / 2.0D * damage; if (entity instanceof Monster monster) { - monster.hurt(this.damageSource, (int) damageFinal * (1 + 0.2f * this.damageMultiplier)); + monster.hurt(this.damageSource, (float) damageFinal * (1 + 0.2f * this.damageMultiplier)); } else { - entity.hurt(this.damageSource, (float) ((int) damageFinal)); + entity.hurt(this.damageSource, (float) damageFinal); } if (entity instanceof LivingEntity) { entity.invulnerableTime = 0; diff --git a/src/main/java/net/mcreator/superbwarfare/tools/TooltipTool.java b/src/main/java/net/mcreator/superbwarfare/tools/TooltipTool.java index d6a943728..1c7502ef0 100644 --- a/src/main/java/net/mcreator/superbwarfare/tools/TooltipTool.java +++ b/src/main/java/net/mcreator/superbwarfare/tools/TooltipTool.java @@ -28,15 +28,36 @@ public class TooltipTool { } } + public static double perkDamage(ItemStack stack) { + var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); + if (perk instanceof AmmoPerk ammoPerk) { + return ammoPerk.damageRate; + } + return 1; + } + + public static boolean heBullet(ItemStack stack) { + var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); + return perk == ModPerks.HE_BULLET.get(); + } + + public static int heBulletLevel(ItemStack stack) { + var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); + if (perk == ModPerks.HE_BULLET.get()) { + return PerkHelper.getItemPerkLevel(perk, stack); + } + return 0; + } + public static void addGunTips(List tooltip, ItemStack stack) { tooltip.add(Component.literal("")); double damage = ItemNBTTool.getDouble(stack, "damage", 0) - * ItemNBTTool.getDouble(stack, "levelDamageMultiple", 1); + * ItemNBTTool.getDouble(stack, "levelDamageMultiple", 1) * perkDamage(stack); tooltip.add(Component.translatable("des.superbwarfare.tips.damage").withStyle(ChatFormatting.GRAY) .append(Component.literal("").withStyle(ChatFormatting.RESET)) - .append(Component.literal(new DecimalFormat("##.#").format(damage)).withStyle(ChatFormatting.GREEN))); + .append(Component.literal(new DecimalFormat("##.#").format(damage) + (heBullet(stack) ? " + " + new DecimalFormat("##.#").format(0.8 * damage * (1 + 0.1 * heBulletLevel(stack))) : "")).withStyle(ChatFormatting.GREEN))); if (stack.is(ModTags.Items.IS_AUTO_WEAPON)) { addRpmTips(tooltip, stack); } @@ -48,12 +69,29 @@ public class TooltipTool { public static void addShotgunTips(List tooltip, ItemStack stack) { tooltip.add(Component.literal("")); - double damage = ItemNBTTool.getDouble(stack, "damage", 0) - * ItemNBTTool.getDouble(stack, "levelDamageMultiple", 1); + boolean slug = false; - tooltip.add(Component.translatable("des.superbwarfare.tips.damage").withStyle(ChatFormatting.GRAY) - .append(Component.literal("").withStyle(ChatFormatting.RESET)) - .append(Component.literal(new DecimalFormat("##.#").format(damage) + " * " + new DecimalFormat("##").format(ItemNBTTool.getDouble(stack, "projectile_amount", 0))).withStyle(ChatFormatting.GREEN))); + var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); + if (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug) { + slug = true; + } + + if (slug) { + double damage = ItemNBTTool.getDouble(stack, "damage", 0) * ItemNBTTool.getDouble(stack, "projectile_amount", 0) + * ItemNBTTool.getDouble(stack, "levelDamageMultiple", 1) * perkDamage(stack); + + tooltip.add(Component.translatable("des.superbwarfare.tips.damage").withStyle(ChatFormatting.GRAY) + .append(Component.literal("").withStyle(ChatFormatting.RESET)) + .append(Component.literal(new DecimalFormat("##.#").format(damage) + (heBullet(stack) ? " + " + new DecimalFormat("##.#").format(0.8 * damage * (1 + 0.1 * heBulletLevel(stack))) : "")).withStyle(ChatFormatting.GREEN))); + + } else { + double damage = ItemNBTTool.getDouble(stack, "damage", 0) + * ItemNBTTool.getDouble(stack, "levelDamageMultiple", 1) * perkDamage(stack); + + tooltip.add(Component.translatable("des.superbwarfare.tips.damage").withStyle(ChatFormatting.GRAY) + .append(Component.literal("").withStyle(ChatFormatting.RESET)) + .append(Component.literal(new DecimalFormat("##.#").format(damage) + " * " + new DecimalFormat("##").format(ItemNBTTool.getDouble(stack, "projectile_amount", 0))).withStyle(ChatFormatting.GREEN))); + } if (stack.is(ModTags.Items.IS_AUTO_WEAPON)) { addRpmTips(tooltip, stack); @@ -126,12 +164,30 @@ public class TooltipTool { if (!ammoTag.isEmpty()) { String id = ammoTag.getString("id").split(":")[1]; + var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); tooltip.add(Component.translatable("perk.superbwarfare.slot_Ammo").withStyle(ChatFormatting.YELLOW) .append(Component.literal(" >> ")) .append(Component.literal("").withStyle(ChatFormatting.RESET)) .append(Component.translatable("item.superbwarfare." + id).withStyle(ChatFormatting.WHITE)) .append(Component.literal(" Lvl. " + ammoTag.getInt("level")).withStyle(ChatFormatting.WHITE))); addHideText(tooltip, Component.translatable("des.superbwarfare." + id).withStyle(ChatFormatting.GRAY)); + if (perk instanceof AmmoPerk ammoPerk) { + if (ammoPerk.damageRate < 1) { + addHideText(tooltip, Component.translatable("des.superbwarfare.perk_damage_reduce").withStyle(ChatFormatting.RED)); + } else if (ammoPerk.damageRate > 1) { + addHideText(tooltip, Component.translatable("des.superbwarfare.perk_damage_plus").withStyle(ChatFormatting.GREEN)); + } + + if (ammoPerk.speedRate < 1) { + addHideText(tooltip, Component.translatable("des.superbwarfare.perk_speed_reduce").withStyle(ChatFormatting.RED)); + } else if (ammoPerk.speedRate > 1) { + addHideText(tooltip, Component.translatable("des.superbwarfare.perk_speed_plus").withStyle(ChatFormatting.GREEN)); + } + + if (ammoPerk.slug && stack.is(ModTags.Items.SHOTGUN)) { + addHideText(tooltip, Component.translatable("des.superbwarfare.perk_slug").withStyle(ChatFormatting.YELLOW)); + } + } } if (!functionalTag.isEmpty()) { @@ -157,14 +213,26 @@ public class TooltipTool { public static void addBocekTips(List tooltip, ItemStack stack) { tooltip.add(Component.literal("")); + boolean slug = false; - double total = ItemNBTTool.getDouble(stack, "damage", 0) * ItemNBTTool.getDouble(stack, "levelDamageMultiple", 1); + var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); + if (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug) { + slug = true; + } - tooltip.add(Component.translatable("des.superbwarfare.tips.damage").withStyle(ChatFormatting.GRAY) - .append(Component.literal("").withStyle(ChatFormatting.RESET)) - .append(Component.literal(new DecimalFormat("##.#").format(total * 0.1) + " * 10").withStyle(ChatFormatting.GREEN)) - .append(Component.literal(" / ").withStyle(ChatFormatting.RESET)) - .append(Component.literal(new DecimalFormat("##.#").format(total)).withStyle(ChatFormatting.GREEN))); + double total = ItemNBTTool.getDouble(stack, "damage", 0) * ItemNBTTool.getDouble(stack, "levelDamageMultiple", 1) * perkDamage(stack); + + if (slug) { + tooltip.add(Component.translatable("des.superbwarfare.tips.damage").withStyle(ChatFormatting.GRAY) + .append(Component.literal("").withStyle(ChatFormatting.RESET)) + .append(Component.literal(new DecimalFormat("##.#").format(total) + (heBullet(stack) ? " + " + new DecimalFormat("##.#").format(0.8 * total * (1 + 0.1 * heBulletLevel(stack))) : "")).withStyle(ChatFormatting.GREEN))); + } else { + tooltip.add(Component.translatable("des.superbwarfare.tips.damage").withStyle(ChatFormatting.GRAY) + .append(Component.literal("").withStyle(ChatFormatting.RESET)) + .append(Component.literal(new DecimalFormat("##.#").format(total * 0.1) + " * 10").withStyle(ChatFormatting.GREEN)) + .append(Component.literal(" / ").withStyle(ChatFormatting.RESET)) + .append(Component.literal(new DecimalFormat("##.#").format(total)).withStyle(ChatFormatting.GREEN))); + } addLevelTips(tooltip, stack); addBypassTips(tooltip, stack); @@ -183,17 +251,18 @@ public class TooltipTool { if (flag.get()) { double damage = (ItemNBTTool.getDouble(stack, "damage", 0) + ItemNBTTool.getDouble(stack, "sentinelChargeDamage", 0)) - * ItemNBTTool.getDouble(stack, "levelDamageMultiple", 1); + * ItemNBTTool.getDouble(stack, "levelDamageMultiple", 1) + * perkDamage(stack); tooltip.add(Component.translatable("des.superbwarfare.tips.damage").withStyle(ChatFormatting.GRAY) .append(Component.literal("").withStyle(ChatFormatting.RESET)) - .append(Component.literal(new DecimalFormat("##.#").format(damage)).withStyle(ChatFormatting.AQUA).withStyle(ChatFormatting.BOLD))); + .append(Component.literal(new DecimalFormat("##.#").format(damage) + (heBullet(stack) ? " + " + new DecimalFormat("##.#").format(0.8 * damage * (1 + 0.1 * heBulletLevel(stack))) : "")).withStyle(ChatFormatting.AQUA).withStyle(ChatFormatting.BOLD))); } else { - double damage = ItemNBTTool.getDouble(stack, "damage", 0) * ItemNBTTool.getDouble(stack, "levelDamageMultiple", 1); + double damage = ItemNBTTool.getDouble(stack, "damage", 0) * ItemNBTTool.getDouble(stack, "levelDamageMultiple", 1) * perkDamage(stack); tooltip.add(Component.translatable("des.superbwarfare.tips.damage").withStyle(ChatFormatting.GRAY) .append(Component.literal("").withStyle(ChatFormatting.RESET)) - .append(Component.literal(new DecimalFormat("##.#").format(damage)).withStyle(ChatFormatting.GREEN))); + .append(Component.literal(new DecimalFormat("##.#").format(damage) + (heBullet(stack) ? new DecimalFormat("##.#").format(0.4 * damage * (1 + 0.1 * heBulletLevel(stack))) : "")).withStyle(ChatFormatting.GREEN))); } if (stack.is(ModTags.Items.IS_AUTO_WEAPON)) { diff --git a/src/main/resources/assets/superbwarfare/lang/en_us.json b/src/main/resources/assets/superbwarfare/lang/en_us.json index 5581f104e..f50d1380b 100644 --- a/src/main/resources/assets/superbwarfare/lang/en_us.json +++ b/src/main/resources/assets/superbwarfare/lang/en_us.json @@ -386,6 +386,12 @@ "config.superbwarfare.client.display.camera_rotate.des": "手持枪械时,视角会出现轻微的摇晃", "config.superbwarfare.client.display.armor_plate_hud": "Armor Plate HUD", "config.superbwarfare.client.display.armor_plate_hud.des": "开启时,在屏幕左下角显示当前胸甲装备的防弹插板的耐久", - "des.superbwarfare.use_tip.ammobox": "潜行左键切换弹药种类,潜行右键取出身上该类型弹药,非潜行右键取出相应种类弹药。" + "des.superbwarfare.use_tip.ammobox": "潜行左键切换弹药种类,潜行右键取出身上该类型弹药,非潜行右键取出相应种类弹药。", + + "des.superbwarfare.perk_damage_reduce": "Damage -", + "des.superbwarfare.perk_damage_plus": "Damage +", + "des.superbwarfare.perk_speed_reduce": "Velocity -", + "des.superbwarfare.perk_speed_plus": "Velocity +", + "des.superbwarfare.perk_slug": "Slug" } \ No newline at end of file diff --git a/src/main/resources/assets/superbwarfare/lang/zh_cn.json b/src/main/resources/assets/superbwarfare/lang/zh_cn.json index b1a2af640..9eafd5f05 100644 --- a/src/main/resources/assets/superbwarfare/lang/zh_cn.json +++ b/src/main/resources/assets/superbwarfare/lang/zh_cn.json @@ -384,5 +384,11 @@ "config.superbwarfare.client.display.camera_rotate": "视角摇晃", "config.superbwarfare.client.display.camera_rotate.des": "手持枪械时,视角会出现轻微的摇晃", "config.superbwarfare.client.display.armor_plate_hud": "防弹插板信息", - "config.superbwarfare.client.display.armor_plate_hud.des": "开启时,在屏幕左下角显示当前胸甲装备的防弹插板的耐久" + "config.superbwarfare.client.display.armor_plate_hud.des": "开启时,在屏幕左下角显示当前胸甲装备的防弹插板的耐久", + + "des.superbwarfare.perk_damage_reduce": "伤害 -", + "des.superbwarfare.perk_damage_plus": "伤害 +", + "des.superbwarfare.perk_speed_reduce": "子弹初速 -", + "des.superbwarfare.perk_speed_plus": "子弹初速 +", + "des.superbwarfare.perk_slug": "独头弹" } \ No newline at end of file