From f138f1aaf28a131ce060df880f1e679aa005ba0c Mon Sep 17 00:00:00 2001 From: 17146 <1714673995@qq.com> Date: Wed, 7 May 2025 12:04:08 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=E9=83=A8=E5=88=86=E4=BC=A4?= =?UTF-8?q?=E5=AE=B3perk?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../event/LivingEventHandler.java | 61 ++----------------- .../superbwarfare/init/ModPerks.java | 9 ++- .../superbwarfare/item/gun/GunItem.java | 2 - .../atsuishio/superbwarfare/perk/Perk.java | 2 +- .../perk/damage/GutshotStraight.java | 25 ++++++++ .../superbwarfare/perk/damage/HeadSeeker.java | 38 ++++++++++++ .../superbwarfare/perk/damage/KillClip.java | 7 --- .../perk/damage/VorpalWeapon.java | 27 ++++++++ .../perk/functional/HealClip.java | 7 --- 9 files changed, 101 insertions(+), 77 deletions(-) create mode 100644 src/main/java/com/atsuishio/superbwarfare/perk/damage/GutshotStraight.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/perk/damage/HeadSeeker.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/perk/damage/VorpalWeapon.java diff --git a/src/main/java/com/atsuishio/superbwarfare/event/LivingEventHandler.java b/src/main/java/com/atsuishio/superbwarfare/event/LivingEventHandler.java index f46a144f6..c1d25c894 100644 --- a/src/main/java/com/atsuishio/superbwarfare/event/LivingEventHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/event/LivingEventHandler.java @@ -492,26 +492,15 @@ public class LivingEventHandler { for (Perk.Type type : Perk.Type.values()) { var instance = data.perk.getInstance(type); if (instance != null) { + instance.perk().onHit(damage, data, instance, event.getEntity(), source); damage = instance.perk().getModifiedDamage(damage, data, instance, event.getEntity(), source); } } - if (DamageTypeTool.isGunDamage(source) || source.is(ModDamageTypes.PROJECTILE_BOOM)) { - handleVorpalWeaponDamage(stack, event); - } - - if (DamageTypeTool.isGunFireDamage(source) && source.getDirectEntity() instanceof ProjectileEntity projectile && projectile.isZoom()) { - handleGutshotStraightDamage(stack, event); - } - if (DamageTypeTool.isGunDamage(source)) { handleKillingTallyDamage(stack, event); } - if (DamageTypeTool.isGunFireDamage(source)) { - handleHeadSeekerTime(stack); - } - if (source.getDirectEntity() instanceof ProjectileEntity projectile) { if (data.perk.getLevel(ModPerks.FOURTH_TIMES_CHARM) > 0) { float bypassArmorRate = projectile.getBypassArmorRate(); @@ -527,10 +516,6 @@ public class LivingEventHandler { } } - if (DamageTypeTool.isHeadshotDamage(source)) { - handleHeadSeekerDamage(stack, event); - } - event.setAmount(damage); } @@ -572,19 +557,12 @@ public class LivingEventHandler { } } - private static void handleGutshotStraightDamage(ItemStack stack, LivingIncomingDamageEvent event) { - int level = GunData.from(stack).perk.getLevel(ModPerks.GUTSHOT_STRAIGHT); - if (level == 0) { - return; - } - - event.setAmount(event.getAmount() * (1.15f + 0.05f * level)); - } - private static void handleKillingTallyDamage(ItemStack stack, LivingIncomingDamageEvent event) { var data = GunData.from(stack); int level = data.perk.getLevel(ModPerks.KILLING_TALLY); - if (level == 0) return; + if (level == 0) { + return; + } int killTally = data.perk.getTag(ModPerks.KILLING_TALLY).getInt("KillingTally"); if (killTally == 0) { @@ -661,26 +639,6 @@ public class LivingEventHandler { } } - private static void handleHeadSeekerTime(ItemStack stack) { - var data = GunData.from(stack); - int level = data.perk.getLevel(ModPerks.HEAD_SEEKER); - if (level == 0) return; - - data.perk.getTag(ModPerks.HEAD_SEEKER).putInt("HeadSeeker", 11 + level * 2); - data.save(); - } - - private static void handleHeadSeekerDamage(ItemStack stack, LivingIncomingDamageEvent event) { - var data = GunData.from(stack); - int level = data.perk.getLevel(ModPerks.HEAD_SEEKER); - if (level == 0) return; - - var tag = data.perk.getTag(ModPerks.HEAD_SEEKER); - if (tag.getInt("HeadSeeker") > 0) { - event.setAmount(event.getAmount() * (1.095f + 0.0225f * level)); - } - } - private static void handleDesperado(ItemStack stack) { var data = GunData.from(stack); int level = data.perk.getLevel(ModPerks.DESPERADO); @@ -802,17 +760,6 @@ public class LivingEventHandler { } } - private static void handleVorpalWeaponDamage(ItemStack stack, LivingIncomingDamageEvent event) { - var entity = event.getEntity(); - var data = GunData.from(stack); - - int level = data.perk.getLevel(ModPerks.VORPAL_WEAPON); - if (level <= 0) return; - if (entity.getHealth() < 100.0f) return; - - event.setAmount((float) (event.getAmount() + entity.getHealth() * 0.00002f * Math.pow(level, 2))); - } - @SubscribeEvent public static void onKnockback(LivingKnockBackEvent event) { ICustomKnockback knockback = ICustomKnockback.getInstance(event.getEntity()); diff --git a/src/main/java/com/atsuishio/superbwarfare/init/ModPerks.java b/src/main/java/com/atsuishio/superbwarfare/init/ModPerks.java index f0d592a80..a7e4619c1 100644 --- a/src/main/java/com/atsuishio/superbwarfare/init/ModPerks.java +++ b/src/main/java/com/atsuishio/superbwarfare/init/ModPerks.java @@ -3,7 +3,10 @@ package com.atsuishio.superbwarfare.init; import com.atsuishio.superbwarfare.Mod; import com.atsuishio.superbwarfare.perk.AmmoPerk; import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.perk.damage.GutshotStraight; +import com.atsuishio.superbwarfare.perk.damage.HeadSeeker; import com.atsuishio.superbwarfare.perk.damage.KillClip; +import com.atsuishio.superbwarfare.perk.damage.VorpalWeapon; import com.atsuishio.superbwarfare.perk.functional.HealClip; import net.minecraft.resources.ResourceKey; import net.minecraft.world.effect.MobEffects; @@ -69,13 +72,13 @@ public class ModPerks { public static final DeferredRegister DAMAGE_PERKS = DeferredRegister.create(Mod.loc("perk"), Mod.MODID); public static final DeferredHolder KILL_CLIP = DAMAGE_PERKS.register("kill_clip", KillClip::new); - public static final DeferredHolder GUTSHOT_STRAIGHT = DAMAGE_PERKS.register("gutshot_straight", () -> new Perk("gutshot_straight", Perk.Type.DAMAGE)); + public static final DeferredHolder GUTSHOT_STRAIGHT = DAMAGE_PERKS.register("gutshot_straight", GutshotStraight::new); public static final DeferredHolder KILLING_TALLY = DAMAGE_PERKS.register("killing_tally", () -> new Perk("killing_tally", Perk.Type.DAMAGE)); - public static final DeferredHolder HEAD_SEEKER = DAMAGE_PERKS.register("head_seeker", () -> new Perk("head_seeker", Perk.Type.DAMAGE)); + public static final DeferredHolder HEAD_SEEKER = DAMAGE_PERKS.register("head_seeker", HeadSeeker::new); public static final DeferredHolder MONSTER_HUNTER = DAMAGE_PERKS.register("monster_hunter", () -> new Perk("monster_hunter", Perk.Type.DAMAGE)); public static final DeferredHolder VOLT_OVERLOAD = DAMAGE_PERKS.register("volt_overload", () -> new Perk("volt_overload", Perk.Type.DAMAGE)); public static final DeferredHolder DESPERADO = DAMAGE_PERKS.register("desperado", () -> new Perk("desperado", Perk.Type.DAMAGE)); - public static final DeferredHolder VORPAL_WEAPON = DAMAGE_PERKS.register("vorpal_weapon", () -> new Perk("vorpal_weapon", Perk.Type.DAMAGE)); + public static final DeferredHolder VORPAL_WEAPON = DAMAGE_PERKS.register("vorpal_weapon", VorpalWeapon::new); // public static void registerCompatPerks() { // if (ModList.get().isLoaded(CompatHolder.DMV)) { 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 59b6cff32..0230e0cb2 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/GunItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/GunItem.java @@ -203,8 +203,6 @@ public abstract class GunItem extends Item implements CustomRendererItem { perk.reduceCooldown(ModPerks.FOURTH_TIMES_CHARM, "FourthTimesCharmTick"); - perk.reduceCooldown(ModPerks.HEAD_SEEKER, "HeadSeeker"); - perk.reduceCooldown(ModPerks.DESPERADO, "DesperadoTime"); perk.reduceCooldown(ModPerks.DESPERADO, "DesperadoTimePost"); diff --git a/src/main/java/com/atsuishio/superbwarfare/perk/Perk.java b/src/main/java/com/atsuishio/superbwarfare/perk/Perk.java index ed29bf3a6..9242a91e7 100644 --- a/src/main/java/com/atsuishio/superbwarfare/perk/Perk.java +++ b/src/main/java/com/atsuishio/superbwarfare/perk/Perk.java @@ -63,7 +63,7 @@ public class Perk { public void onKill(GunData data, PerkInstance instance, LivingEntity target, DamageSource source) { } - public void onShoot() { + public void onHit(float damage, GunData data, PerkInstance instance, LivingEntity target, DamageSource source) { } public float getModifiedDamage(float damage, GunData data, PerkInstance instance, @Nullable LivingEntity target, DamageSource source) { diff --git a/src/main/java/com/atsuishio/superbwarfare/perk/damage/GutshotStraight.java b/src/main/java/com/atsuishio/superbwarfare/perk/damage/GutshotStraight.java new file mode 100644 index 000000000..07c4a7b5e --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/perk/damage/GutshotStraight.java @@ -0,0 +1,25 @@ +package com.atsuishio.superbwarfare.perk.damage; + +import com.atsuishio.superbwarfare.entity.projectile.ProjectileEntity; +import com.atsuishio.superbwarfare.item.gun.data.GunData; +import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.perk.PerkInstance; +import com.atsuishio.superbwarfare.tools.DamageTypeTool; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.LivingEntity; +import org.jetbrains.annotations.Nullable; + +public class GutshotStraight extends Perk { + + public GutshotStraight() { + super("gutshot_straight", Perk.Type.DAMAGE); + } + + @Override + public float getModifiedDamage(float damage, GunData data, PerkInstance instance, @Nullable LivingEntity target, DamageSource source) { + if (DamageTypeTool.isGunFireDamage(source) && source.getDirectEntity() instanceof ProjectileEntity projectile && projectile.isZoom()) { + return damage * (1.15f + 0.05f * instance.level()); + } + return super.getModifiedDamage(damage, data, instance, target, source); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/perk/damage/HeadSeeker.java b/src/main/java/com/atsuishio/superbwarfare/perk/damage/HeadSeeker.java new file mode 100644 index 000000000..c3410eda1 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/perk/damage/HeadSeeker.java @@ -0,0 +1,38 @@ +package com.atsuishio.superbwarfare.perk.damage; + +import com.atsuishio.superbwarfare.item.gun.data.GunData; +import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.perk.PerkInstance; +import com.atsuishio.superbwarfare.tools.DamageTypeTool; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.LivingEntity; +import org.jetbrains.annotations.Nullable; + +public class HeadSeeker extends Perk { + + public HeadSeeker() { + super("head_seeker", Perk.Type.DAMAGE); + } + + @Override + public void tick(GunData data, PerkInstance instance, @Nullable LivingEntity living) { + data.perk.reduceCooldown(this, "HeadSeeker"); + } + + @Override + public void onHit(float damage, GunData data, PerkInstance instance, LivingEntity target, DamageSource source) { + if (DamageTypeTool.isGunFireDamage(source)) { + data.perk.getTag(this).putInt("HeadSeeker", 11 + instance.level() * 2); + } + } + + @Override + public float getModifiedDamage(float damage, GunData data, PerkInstance instance, @Nullable LivingEntity target, DamageSource source) { + if (DamageTypeTool.isHeadshotDamage(source)) { + if (data.perk.getTag(this).getInt("HeadSeeker") > 0) { + return damage * (1.095f + 0.0225f * instance.level()); + } + } + return super.getModifiedDamage(damage, data, instance, target, source); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/perk/damage/KillClip.java b/src/main/java/com/atsuishio/superbwarfare/perk/damage/KillClip.java index 2a3b46808..a5709170e 100644 --- a/src/main/java/com/atsuishio/superbwarfare/perk/damage/KillClip.java +++ b/src/main/java/com/atsuishio/superbwarfare/perk/damage/KillClip.java @@ -17,15 +17,12 @@ public class KillClip extends Perk { @Override public void tick(GunData data, PerkInstance instance, @Nullable LivingEntity living) { - super.tick(data, instance, living); data.perk.reduceCooldown(this, "KillClipReloadTime"); data.perk.reduceCooldown(this, "KillClipTime"); } @Override public void preReload(GunData data, PerkInstance instance, @Nullable LivingEntity living) { - super.preReload(data, instance, living); - int time = data.perk.getTag(this).getInt("KillClipReloadTime"); if (time > 0) { data.perk.getTag(this).remove("KillClipReloadTime"); @@ -37,8 +34,6 @@ public class KillClip extends Perk { @Override public void postReload(GunData data, PerkInstance instance, @Nullable LivingEntity living) { - super.postReload(data, instance, living); - if (!data.perk.getTag(this).getBoolean("KillClip")) { return; } @@ -49,8 +44,6 @@ public class KillClip extends Perk { @Override public void onKill(GunData data, PerkInstance instance, LivingEntity target, DamageSource source) { - super.onKill(data, instance, target, source); - if (DamageTypeTool.isGunDamage(source) || source.is(ModDamageTypes.PROJECTILE_BOOM)) { int killClipLevel = instance.level(); if (killClipLevel != 0) { diff --git a/src/main/java/com/atsuishio/superbwarfare/perk/damage/VorpalWeapon.java b/src/main/java/com/atsuishio/superbwarfare/perk/damage/VorpalWeapon.java new file mode 100644 index 000000000..fbd249e0d --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/perk/damage/VorpalWeapon.java @@ -0,0 +1,27 @@ +package com.atsuishio.superbwarfare.perk.damage; + +import com.atsuishio.superbwarfare.init.ModDamageTypes; +import com.atsuishio.superbwarfare.item.gun.data.GunData; +import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.perk.PerkInstance; +import com.atsuishio.superbwarfare.tools.DamageTypeTool; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.LivingEntity; +import org.jetbrains.annotations.Nullable; + +public class VorpalWeapon extends Perk { + + public VorpalWeapon() { + super("vorpal_weapon", Perk.Type.DAMAGE); + } + + @Override + public float getModifiedDamage(float damage, GunData data, PerkInstance instance, @Nullable LivingEntity target, DamageSource source) { + if (DamageTypeTool.isGunDamage(source) || source.is(ModDamageTypes.PROJECTILE_BOOM)) { + if (target != null && target.getHealth() >= 100.0f) { + return (float) (damage + target.getHealth() * 0.00002f * Math.pow(instance.level(), 2)); + } + } + return super.getModifiedDamage(damage, data, instance, target, source); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/perk/functional/HealClip.java b/src/main/java/com/atsuishio/superbwarfare/perk/functional/HealClip.java index 15d77f55a..cad20080e 100644 --- a/src/main/java/com/atsuishio/superbwarfare/perk/functional/HealClip.java +++ b/src/main/java/com/atsuishio/superbwarfare/perk/functional/HealClip.java @@ -20,14 +20,11 @@ public class HealClip extends Perk { @Override public void tick(GunData data, PerkInstance instance, @Nullable LivingEntity living) { - super.tick(data, instance, living); data.perk.reduceCooldown(this, "HealClipTime"); } @Override public void onKill(GunData data, PerkInstance instance, LivingEntity target, DamageSource source) { - super.onKill(data, instance, target, source); - if (DamageTypeTool.isGunDamage(source) || source.is(ModDamageTypes.PROJECTILE_BOOM)) { int healClipLevel = instance.level(); if (healClipLevel != 0) { @@ -38,8 +35,6 @@ public class HealClip extends Perk { @Override public void preReload(GunData data, PerkInstance instance, @Nullable LivingEntity living) { - super.preReload(data, instance, living); - int time = data.perk.getTag(this).getInt("HealClipTime"); if (time > 0) { data.perk.getTag(this).remove("HealClipTime"); @@ -51,8 +46,6 @@ public class HealClip extends Perk { @Override public void postReload(GunData data, PerkInstance instance, @Nullable LivingEntity living) { - super.postReload(data, instance, living); - if (living == null) return; if (!data.perk.getTag(this).contains("HealClip")) {