重构部分伤害perk

This commit is contained in:
17146 2025-05-07 12:04:08 +08:00 committed by Light_Quanta
parent d4deb03eaf
commit f138f1aaf2
No known key found for this signature in database
GPG key ID: 11A39A1B8C890959
9 changed files with 101 additions and 77 deletions

View file

@ -492,26 +492,15 @@ public class LivingEventHandler {
for (Perk.Type type : Perk.Type.values()) { for (Perk.Type type : Perk.Type.values()) {
var instance = data.perk.getInstance(type); var instance = data.perk.getInstance(type);
if (instance != null) { if (instance != null) {
instance.perk().onHit(damage, data, instance, event.getEntity(), source);
damage = instance.perk().getModifiedDamage(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)) { if (DamageTypeTool.isGunDamage(source)) {
handleKillingTallyDamage(stack, event); handleKillingTallyDamage(stack, event);
} }
if (DamageTypeTool.isGunFireDamage(source)) {
handleHeadSeekerTime(stack);
}
if (source.getDirectEntity() instanceof ProjectileEntity projectile) { if (source.getDirectEntity() instanceof ProjectileEntity projectile) {
if (data.perk.getLevel(ModPerks.FOURTH_TIMES_CHARM) > 0) { if (data.perk.getLevel(ModPerks.FOURTH_TIMES_CHARM) > 0) {
float bypassArmorRate = projectile.getBypassArmorRate(); float bypassArmorRate = projectile.getBypassArmorRate();
@ -527,10 +516,6 @@ public class LivingEventHandler {
} }
} }
if (DamageTypeTool.isHeadshotDamage(source)) {
handleHeadSeekerDamage(stack, event);
}
event.setAmount(damage); 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) { private static void handleKillingTallyDamage(ItemStack stack, LivingIncomingDamageEvent event) {
var data = GunData.from(stack); var data = GunData.from(stack);
int level = data.perk.getLevel(ModPerks.KILLING_TALLY); 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"); int killTally = data.perk.getTag(ModPerks.KILLING_TALLY).getInt("KillingTally");
if (killTally == 0) { 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) { private static void handleDesperado(ItemStack stack) {
var data = GunData.from(stack); var data = GunData.from(stack);
int level = data.perk.getLevel(ModPerks.DESPERADO); 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 @SubscribeEvent
public static void onKnockback(LivingKnockBackEvent event) { public static void onKnockback(LivingKnockBackEvent event) {
ICustomKnockback knockback = ICustomKnockback.getInstance(event.getEntity()); ICustomKnockback knockback = ICustomKnockback.getInstance(event.getEntity());

View file

@ -3,7 +3,10 @@ package com.atsuishio.superbwarfare.init;
import com.atsuishio.superbwarfare.Mod; import com.atsuishio.superbwarfare.Mod;
import com.atsuishio.superbwarfare.perk.AmmoPerk; import com.atsuishio.superbwarfare.perk.AmmoPerk;
import com.atsuishio.superbwarfare.perk.Perk; 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.KillClip;
import com.atsuishio.superbwarfare.perk.damage.VorpalWeapon;
import com.atsuishio.superbwarfare.perk.functional.HealClip; import com.atsuishio.superbwarfare.perk.functional.HealClip;
import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceKey;
import net.minecraft.world.effect.MobEffects; import net.minecraft.world.effect.MobEffects;
@ -69,13 +72,13 @@ public class ModPerks {
public static final DeferredRegister<Perk> DAMAGE_PERKS = DeferredRegister.create(Mod.loc("perk"), Mod.MODID); public static final DeferredRegister<Perk> DAMAGE_PERKS = DeferredRegister.create(Mod.loc("perk"), Mod.MODID);
public static final DeferredHolder<Perk, Perk> KILL_CLIP = DAMAGE_PERKS.register("kill_clip", KillClip::new); public static final DeferredHolder<Perk, Perk> KILL_CLIP = DAMAGE_PERKS.register("kill_clip", KillClip::new);
public static final DeferredHolder<Perk, Perk> GUTSHOT_STRAIGHT = DAMAGE_PERKS.register("gutshot_straight", () -> new Perk("gutshot_straight", Perk.Type.DAMAGE)); public static final DeferredHolder<Perk, Perk> GUTSHOT_STRAIGHT = DAMAGE_PERKS.register("gutshot_straight", GutshotStraight::new);
public static final DeferredHolder<Perk, Perk> KILLING_TALLY = DAMAGE_PERKS.register("killing_tally", () -> new Perk("killing_tally", Perk.Type.DAMAGE)); public static final DeferredHolder<Perk, Perk> KILLING_TALLY = DAMAGE_PERKS.register("killing_tally", () -> new Perk("killing_tally", Perk.Type.DAMAGE));
public static final DeferredHolder<Perk, Perk> HEAD_SEEKER = DAMAGE_PERKS.register("head_seeker", () -> new Perk("head_seeker", Perk.Type.DAMAGE)); public static final DeferredHolder<Perk, Perk> HEAD_SEEKER = DAMAGE_PERKS.register("head_seeker", HeadSeeker::new);
public static final DeferredHolder<Perk, Perk> MONSTER_HUNTER = DAMAGE_PERKS.register("monster_hunter", () -> new Perk("monster_hunter", Perk.Type.DAMAGE)); public static final DeferredHolder<Perk, Perk> MONSTER_HUNTER = DAMAGE_PERKS.register("monster_hunter", () -> new Perk("monster_hunter", Perk.Type.DAMAGE));
public static final DeferredHolder<Perk, Perk> VOLT_OVERLOAD = DAMAGE_PERKS.register("volt_overload", () -> new Perk("volt_overload", Perk.Type.DAMAGE)); public static final DeferredHolder<Perk, Perk> VOLT_OVERLOAD = DAMAGE_PERKS.register("volt_overload", () -> new Perk("volt_overload", Perk.Type.DAMAGE));
public static final DeferredHolder<Perk, Perk> DESPERADO = DAMAGE_PERKS.register("desperado", () -> new Perk("desperado", Perk.Type.DAMAGE)); public static final DeferredHolder<Perk, Perk> DESPERADO = DAMAGE_PERKS.register("desperado", () -> new Perk("desperado", Perk.Type.DAMAGE));
public static final DeferredHolder<Perk, Perk> VORPAL_WEAPON = DAMAGE_PERKS.register("vorpal_weapon", () -> new Perk("vorpal_weapon", Perk.Type.DAMAGE)); public static final DeferredHolder<Perk, Perk> VORPAL_WEAPON = DAMAGE_PERKS.register("vorpal_weapon", VorpalWeapon::new);
// public static void registerCompatPerks() { // public static void registerCompatPerks() {
// if (ModList.get().isLoaded(CompatHolder.DMV)) { // if (ModList.get().isLoaded(CompatHolder.DMV)) {

View file

@ -203,8 +203,6 @@ public abstract class GunItem extends Item implements CustomRendererItem {
perk.reduceCooldown(ModPerks.FOURTH_TIMES_CHARM, "FourthTimesCharmTick"); perk.reduceCooldown(ModPerks.FOURTH_TIMES_CHARM, "FourthTimesCharmTick");
perk.reduceCooldown(ModPerks.HEAD_SEEKER, "HeadSeeker");
perk.reduceCooldown(ModPerks.DESPERADO, "DesperadoTime"); perk.reduceCooldown(ModPerks.DESPERADO, "DesperadoTime");
perk.reduceCooldown(ModPerks.DESPERADO, "DesperadoTimePost"); perk.reduceCooldown(ModPerks.DESPERADO, "DesperadoTimePost");

View file

@ -63,7 +63,7 @@ public class Perk {
public void onKill(GunData data, PerkInstance instance, LivingEntity target, DamageSource source) { 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) { public float getModifiedDamage(float damage, GunData data, PerkInstance instance, @Nullable LivingEntity target, DamageSource source) {

View file

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

View file

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

View file

@ -17,15 +17,12 @@ public class KillClip extends Perk {
@Override @Override
public void tick(GunData data, PerkInstance instance, @Nullable LivingEntity living) { public void tick(GunData data, PerkInstance instance, @Nullable LivingEntity living) {
super.tick(data, instance, living);
data.perk.reduceCooldown(this, "KillClipReloadTime"); data.perk.reduceCooldown(this, "KillClipReloadTime");
data.perk.reduceCooldown(this, "KillClipTime"); data.perk.reduceCooldown(this, "KillClipTime");
} }
@Override @Override
public void preReload(GunData data, PerkInstance instance, @Nullable LivingEntity living) { public void preReload(GunData data, PerkInstance instance, @Nullable LivingEntity living) {
super.preReload(data, instance, living);
int time = data.perk.getTag(this).getInt("KillClipReloadTime"); int time = data.perk.getTag(this).getInt("KillClipReloadTime");
if (time > 0) { if (time > 0) {
data.perk.getTag(this).remove("KillClipReloadTime"); data.perk.getTag(this).remove("KillClipReloadTime");
@ -37,8 +34,6 @@ public class KillClip extends Perk {
@Override @Override
public void postReload(GunData data, PerkInstance instance, @Nullable LivingEntity living) { public void postReload(GunData data, PerkInstance instance, @Nullable LivingEntity living) {
super.postReload(data, instance, living);
if (!data.perk.getTag(this).getBoolean("KillClip")) { if (!data.perk.getTag(this).getBoolean("KillClip")) {
return; return;
} }
@ -49,8 +44,6 @@ public class KillClip extends Perk {
@Override @Override
public void onKill(GunData data, PerkInstance instance, LivingEntity target, DamageSource source) { 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)) { if (DamageTypeTool.isGunDamage(source) || source.is(ModDamageTypes.PROJECTILE_BOOM)) {
int killClipLevel = instance.level(); int killClipLevel = instance.level();
if (killClipLevel != 0) { if (killClipLevel != 0) {

View file

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

View file

@ -20,14 +20,11 @@ public class HealClip extends Perk {
@Override @Override
public void tick(GunData data, PerkInstance instance, @Nullable LivingEntity living) { public void tick(GunData data, PerkInstance instance, @Nullable LivingEntity living) {
super.tick(data, instance, living);
data.perk.reduceCooldown(this, "HealClipTime"); data.perk.reduceCooldown(this, "HealClipTime");
} }
@Override @Override
public void onKill(GunData data, PerkInstance instance, LivingEntity target, DamageSource source) { 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)) { if (DamageTypeTool.isGunDamage(source) || source.is(ModDamageTypes.PROJECTILE_BOOM)) {
int healClipLevel = instance.level(); int healClipLevel = instance.level();
if (healClipLevel != 0) { if (healClipLevel != 0) {
@ -38,8 +35,6 @@ public class HealClip extends Perk {
@Override @Override
public void preReload(GunData data, PerkInstance instance, @Nullable LivingEntity living) { public void preReload(GunData data, PerkInstance instance, @Nullable LivingEntity living) {
super.preReload(data, instance, living);
int time = data.perk.getTag(this).getInt("HealClipTime"); int time = data.perk.getTag(this).getInt("HealClipTime");
if (time > 0) { if (time > 0) {
data.perk.getTag(this).remove("HealClipTime"); data.perk.getTag(this).remove("HealClipTime");
@ -51,8 +46,6 @@ public class HealClip extends Perk {
@Override @Override
public void postReload(GunData data, PerkInstance instance, @Nullable LivingEntity living) { public void postReload(GunData data, PerkInstance instance, @Nullable LivingEntity living) {
super.postReload(data, instance, living);
if (living == null) return; if (living == null) return;
if (!data.perk.getTag(this).contains("HealClip")) { if (!data.perk.getTag(this).contains("HealClip")) {