From 83a309053c476a6717a7cfccc56b4603a61b26da Mon Sep 17 00:00:00 2001 From: 17146 <1714673995@qq.com> Date: Wed, 7 May 2025 12:25:11 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=A7=E7=BB=AD=E9=87=8D=E6=9E=84=E9=83=A8?= =?UTF-8?q?=E5=88=86=E4=BC=A4=E5=AE=B3perk?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../event/ClientEventHandler.java | 8 +-- .../event/LivingEventHandler.java | 52 ++----------------- .../event/ReloadEventHandler.java | 40 -------------- .../superbwarfare/init/ModPerks.java | 9 ++-- .../atsuishio/superbwarfare/perk/Perk.java | 13 +++++ .../superbwarfare/perk/damage/Desperado.java | 50 ++++++++++++++++++ .../perk/damage/KillingTally.java | 41 +++++++++++++++ 7 files changed, 117 insertions(+), 96 deletions(-) create mode 100644 src/main/java/com/atsuishio/superbwarfare/perk/damage/Desperado.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/perk/damage/KillingTally.java diff --git a/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java b/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java index 06d74fc39..fd35252cd 100644 --- a/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java @@ -543,9 +543,11 @@ public class ClientEventHandler { rpm = 600; } - if (GunsTool.getPerkIntTag(tag, "DesperadoTimePost") > 0) { - int perkLevel = data.perk.getLevel(ModPerks.DESPERADO); - rpm *= (int) (1.285 + 0.015 * perkLevel); + for (Perk.Type type : Perk.Type.values()) { + var instance = data.perk.getInstance(type); + if (instance != null) { + rpm = instance.perk().getModifiedRPM(rpm, data, instance); + } } double rps = (double) rpm / 60; diff --git a/src/main/java/com/atsuishio/superbwarfare/event/LivingEventHandler.java b/src/main/java/com/atsuishio/superbwarfare/event/LivingEventHandler.java index c1d25c894..1314a8a42 100644 --- a/src/main/java/com/atsuishio/superbwarfare/event/LivingEventHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/event/LivingEventHandler.java @@ -416,9 +416,11 @@ public class LivingEventHandler { newData.charge.timer.reset(); } - int level = newData.perk.getLevel(ModPerks.KILLING_TALLY); - if (level != 0) { - GunsTool.setPerkIntTag(newTag, "KillingTally", 0); + for (Perk.Type type : Perk.Type.values()) { + var instance = newData.perk.getInstance(type); + if (instance != null) { + instance.perk().onChangeSlot(newData, instance, player); + } } if (player.level() instanceof ServerLevel) { @@ -497,10 +499,6 @@ public class LivingEventHandler { } } - if (DamageTypeTool.isGunDamage(source)) { - handleKillingTallyDamage(stack, event); - } - if (source.getDirectEntity() instanceof ProjectileEntity projectile) { if (data.perk.getLevel(ModPerks.FOURTH_TIMES_CHARM) > 0) { float bypassArmorRate = projectile.getBypassArmorRate(); @@ -548,38 +546,8 @@ public class LivingEventHandler { } if (DamageTypeTool.isGunDamage(source)) { - handleKillingTallyAddCount(stack); handleSubsistence(stack, attacker); } - - if (DamageTypeTool.isHeadshotDamage(source)) { - handleDesperado(stack); - } - } - - 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; - } - - int killTally = data.perk.getTag(ModPerks.KILLING_TALLY).getInt("KillingTally"); - if (killTally == 0) { - return; - } - - event.setAmount(event.getAmount() * (1.0f + (0.1f * level) * killTally)); - } - - private static void handleKillingTallyAddCount(ItemStack stack) { - var data = GunData.from(stack); - int level = data.perk.getLevel(ModPerks.KILLING_TALLY); - if (level != 0) { - var tag = data.perk.getTag(ModPerks.KILLING_TALLY); - tag.putInt("KillingTally", Math.min(3, tag.getInt("KillingTally") + 1)); - data.save(); - } } private static void handleFourthTimesCharm(ItemStack stack) { @@ -639,16 +607,6 @@ public class LivingEventHandler { } } - private static void handleDesperado(ItemStack stack) { - var data = GunData.from(stack); - int level = data.perk.getLevel(ModPerks.DESPERADO); - if (level == 0) return; - - var tag = data.perk.getTag(ModPerks.DESPERADO); - tag.putInt("DesperadoTime", 90 + level * 10); - data.save(); - } - @SubscribeEvent public static void onPickup(ItemEntityPickupEvent.Pre event) { if (!VehicleConfig.VEHICLE_ITEM_PICKUP.get()) return; diff --git a/src/main/java/com/atsuishio/superbwarfare/event/ReloadEventHandler.java b/src/main/java/com/atsuishio/superbwarfare/event/ReloadEventHandler.java index 84e813263..a09ee6c6e 100644 --- a/src/main/java/com/atsuishio/superbwarfare/event/ReloadEventHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/event/ReloadEventHandler.java @@ -1,11 +1,9 @@ package com.atsuishio.superbwarfare.event; import com.atsuishio.superbwarfare.api.event.ReloadEvent; -import com.atsuishio.superbwarfare.init.ModPerks; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.item.gun.data.GunData; import com.atsuishio.superbwarfare.perk.Perk; -import com.atsuishio.superbwarfare.tools.GunsTool; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.neoforged.bus.api.SubscribeEvent; @@ -30,9 +28,6 @@ public class ReloadEventHandler { instance.perk().preReload(data, instance, player); } } - - handleKillingTallyPre(stack); - handleDesperadoPre(stack); } @SubscribeEvent @@ -54,40 +49,5 @@ public class ReloadEventHandler { instance.perk().postReload(data, instance, player); } } - - handleDesperadoPost(stack); - } - - private static void handleKillingTallyPre(ItemStack stack) { - var data = GunData.from(stack); - final var tag = data.tag(); - int level = data.perk.getLevel(ModPerks.KILLING_TALLY); - if (level == 0) return; - - GunsTool.setPerkIntTag(tag, "KillingTally", 0); - data.save(); - } - - private static void handleDesperadoPre(ItemStack stack) { - var data = GunData.from(stack); - final var tag = data.tag(); - int time = GunsTool.getPerkIntTag(tag, "DesperadoTime"); - if (time > 0) { - GunsTool.setPerkIntTag(tag, "DesperadoTime", 0); - GunsTool.setPerkBooleanTag(tag, "Desperado", true); - } else { - GunsTool.setPerkBooleanTag(tag, "Desperado", false); - } - data.save(); - } - - private static void handleDesperadoPost(ItemStack stack) { - var data = GunData.from(stack); - final var tag = data.tag(); - if (!GunsTool.getPerkBooleanTag(tag, "Desperado")) return; - - int level = data.perk.getLevel(ModPerks.DESPERADO); - GunsTool.setPerkIntTag(tag, "DesperadoTimePost", 110 + level * 10); - data.save(); } } diff --git a/src/main/java/com/atsuishio/superbwarfare/init/ModPerks.java b/src/main/java/com/atsuishio/superbwarfare/init/ModPerks.java index a7e4619c1..ae0adabe9 100644 --- a/src/main/java/com/atsuishio/superbwarfare/init/ModPerks.java +++ b/src/main/java/com/atsuishio/superbwarfare/init/ModPerks.java @@ -3,10 +3,7 @@ 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.damage.*; import com.atsuishio.superbwarfare.perk.functional.HealClip; import net.minecraft.resources.ResourceKey; import net.minecraft.world.effect.MobEffects; @@ -73,11 +70,11 @@ public class ModPerks { public static final DeferredHolder KILL_CLIP = DAMAGE_PERKS.register("kill_clip", KillClip::new); 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 KILLING_TALLY = DAMAGE_PERKS.register("killing_tally", KillingTally::new); 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 DESPERADO = DAMAGE_PERKS.register("desperado", Desperado::new); public static final DeferredHolder VORPAL_WEAPON = DAMAGE_PERKS.register("vorpal_weapon", VorpalWeapon::new); // public static void registerCompatPerks() { diff --git a/src/main/java/com/atsuishio/superbwarfare/perk/Perk.java b/src/main/java/com/atsuishio/superbwarfare/perk/Perk.java index 9242a91e7..a1182afe8 100644 --- a/src/main/java/com/atsuishio/superbwarfare/perk/Perk.java +++ b/src/main/java/com/atsuishio/superbwarfare/perk/Perk.java @@ -51,6 +51,9 @@ public class Perk { return result.get(); } + /** + * 在背包中每Tick触发 + */ public void tick(GunData data, PerkInstance instance, @Nullable LivingEntity living) { } @@ -70,6 +73,16 @@ public class Perk { return damage; } + public int getModifiedRPM(int rpm, GunData data, PerkInstance instance) { + return rpm; + } + + /** + * 在切换物品时触发 + */ + public void onChangeSlot(GunData data, PerkInstance instance, @Nullable LivingEntity living) { + } + public enum Type { AMMO("Ammo", ChatFormatting.YELLOW), FUNCTIONAL("Functional", ChatFormatting.GREEN), diff --git a/src/main/java/com/atsuishio/superbwarfare/perk/damage/Desperado.java b/src/main/java/com/atsuishio/superbwarfare/perk/damage/Desperado.java new file mode 100644 index 000000000..b3fcfbc1e --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/perk/damage/Desperado.java @@ -0,0 +1,50 @@ +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 Desperado extends Perk { + + public Desperado() { + super("desperado", Perk.Type.DAMAGE); + } + + @Override + public int getModifiedRPM(int rpm, GunData data, PerkInstance instance) { + if (data.perk.getTag(this).getInt("DesperadoTimePost") > 0) { + return rpm * (int) (1.285 + 0.015 * instance.level()); + } + return super.getModifiedRPM(rpm, data, instance); + } + + @Override + public void onKill(GunData data, PerkInstance instance, LivingEntity target, DamageSource source) { + if (DamageTypeTool.isHeadshotDamage(source)) { + data.perk.getTag(this).putInt("DesperadoTime", 90 + instance.level() * 10); + } + } + + @Override + public void preReload(GunData data, PerkInstance instance, @Nullable LivingEntity living) { + int time = data.perk.getTag(this).getInt("DesperadoTime"); + if (time > 0) { + data.perk.getTag(this).remove("DesperadoTime"); + data.perk.getTag(this).putBoolean("Desperado", true); + } else { + data.perk.getTag(this).remove("Desperado"); + } + } + + @Override + public void postReload(GunData data, PerkInstance instance, @Nullable LivingEntity living) { + if (!data.perk.getTag(this).getBoolean("Desperado")) { + return; + } + data.perk.getTag(this).putInt("DesperadoTimePost", 110 + instance.level() * 10); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/perk/damage/KillingTally.java b/src/main/java/com/atsuishio/superbwarfare/perk/damage/KillingTally.java new file mode 100644 index 000000000..86d89746f --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/perk/damage/KillingTally.java @@ -0,0 +1,41 @@ +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 KillingTally extends Perk { + + public KillingTally() { + super("killing_tally", Perk.Type.DAMAGE); + } + + @Override + public void preReload(GunData data, PerkInstance instance, @Nullable LivingEntity living) { + data.perk.getTag(this).remove("KillingTally"); + } + + @Override + public void onKill(GunData data, PerkInstance instance, LivingEntity target, DamageSource source) { + if (DamageTypeTool.isGunDamage(source)) { + data.perk.getTag(this).putInt("KillingTally", Math.min(3, data.perk.getTag(this).getInt("KillingTally") + 1)); + } + } + + @Override + public float getModifiedDamage(float damage, GunData data, PerkInstance instance, @Nullable LivingEntity target, DamageSource source) { + if (DamageTypeTool.isGunDamage(source)) { + return damage * (1.0f + (0.1f * instance.level()) * data.perk.getTag(this).getInt("KillingTally")); + } + return super.getModifiedDamage(damage, data, instance, target, source); + } + + @Override + public void onChangeSlot(GunData data, PerkInstance instance, @Nullable LivingEntity living) { + data.perk.getTag(this).remove("KillingTally"); + } +}