优化部分弹药perk

This commit is contained in:
17146 2025-05-07 14:23:56 +08:00 committed by Light_Quanta
parent c6798522f1
commit 279f86a6ab
No known key found for this signature in database
GPG key ID: 11A39A1B8C890959
13 changed files with 143 additions and 77 deletions

View file

@ -3,9 +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.ammo.APBullet;
import com.atsuishio.superbwarfare.perk.ammo.BeastBullet;
import com.atsuishio.superbwarfare.perk.ammo.SilverBullet;
import com.atsuishio.superbwarfare.perk.ammo.*;
import com.atsuishio.superbwarfare.perk.damage.*;
import com.atsuishio.superbwarfare.perk.functional.*;
import net.minecraft.resources.ResourceKey;
@ -33,18 +31,15 @@ public class ModPerks {
public static final DeferredRegister<Perk> AMMO_PERKS = DeferredRegister.create(Mod.loc("perk"), Mod.MODID);
public static final DeferredHolder<Perk, Perk> AP_BULLET = AMMO_PERKS.register("ap_bullet", APBullet::new);
public static final DeferredHolder<Perk, Perk> JHP_BULLET = AMMO_PERKS.register("jhp_bullet",
() -> new AmmoPerk(new AmmoPerk.Builder("jhp_bullet", Perk.Type.AMMO).bypassArmorRate(-0.2f).damageRate(1.1f).speedRate(0.95f).slug(true).rgb(230, 131, 65)));
public static final DeferredHolder<Perk, Perk> HE_BULLET = AMMO_PERKS.register("he_bullet",
() -> new AmmoPerk(new AmmoPerk.Builder("he_bullet", Perk.Type.AMMO).bypassArmorRate(-0.3f).damageRate(0.5f).speedRate(0.85f).slug(true).rgb(240, 20, 10)));
public static final DeferredHolder<Perk, Perk> JHP_BULLET = AMMO_PERKS.register("jhp_bullet", JHPBullet::new);
public static final DeferredHolder<Perk, Perk> HE_BULLET = AMMO_PERKS.register("he_bullet", HEBullet::new);
public static final DeferredHolder<Perk, Perk> SILVER_BULLET = AMMO_PERKS.register("silver_bullet", SilverBullet::new);
public static final DeferredHolder<Perk, Perk> POISONOUS_BULLET = AMMO_PERKS.register("poisonous_bullet",
() -> 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::value)));
public static final DeferredHolder<Perk, Perk> BEAST_BULLET = AMMO_PERKS.register("beast_bullet", BeastBullet::new);
public static final DeferredHolder<Perk, Perk> LONGER_WIRE = AMMO_PERKS.register("longer_wire", () -> new Perk("longer_wire", Perk.Type.AMMO));
public static final DeferredHolder<Perk, Perk> INCENDIARY_BULLET = AMMO_PERKS.register("incendiary_bullet",
() -> new AmmoPerk(new AmmoPerk.Builder("incendiary_bullet", Perk.Type.AMMO).bypassArmorRate(-0.4f).damageRate(0.7f).speedRate(0.75f).slug(false).rgb(230, 131, 65)));
public static final DeferredHolder<Perk, Perk> INCENDIARY_BULLET = AMMO_PERKS.register("incendiary_bullet", IncendiaryBullet::new);
public static final DeferredHolder<Perk, Perk> MICRO_MISSILE = AMMO_PERKS.register("micro_missile",
() -> new AmmoPerk(new AmmoPerk.Builder("micro_missile", Perk.Type.AMMO).speedRate(1.2f)));
@ -71,7 +66,7 @@ public class ModPerks {
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", KillingTally::new);
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", MonsterHunter::new);
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", Desperado::new);
public static final DeferredHolder<Perk, Perk> VORPAL_WEAPON = DAMAGE_PERKS.register("vorpal_weapon", VorpalWeapon::new);

View file

@ -4,7 +4,10 @@ import com.atsuishio.superbwarfare.Mod;
import com.atsuishio.superbwarfare.client.PoseTool;
import com.atsuishio.superbwarfare.client.tooltip.component.GunImageComponent;
import com.atsuishio.superbwarfare.entity.projectile.ProjectileEntity;
import com.atsuishio.superbwarfare.init.*;
import com.atsuishio.superbwarfare.init.ModAttachments;
import com.atsuishio.superbwarfare.init.ModItems;
import com.atsuishio.superbwarfare.init.ModPerks;
import com.atsuishio.superbwarfare.init.ModSounds;
import com.atsuishio.superbwarfare.item.CustomRendererItem;
import com.atsuishio.superbwarfare.item.gun.data.GunData;
import com.atsuishio.superbwarfare.item.gun.data.value.AttachmentType;
@ -606,14 +609,6 @@ public abstract class GunItem extends Item implements CustomRendererItem {
public void onFireKeyRelease(final GunData data, Player player, double power, boolean zoom) {
}
public static double perkSpeed(GunData data) {
var perk = data.perk.get(Perk.Type.AMMO);
if (perk instanceof AmmoPerk ammoPerk) {
return ammoPerk.speedRate;
}
return 1;
}
public static double perkDamage(Perk perk) {
if (perk instanceof AmmoPerk ammoPerk) {
return ammoPerk.damageRate;
@ -631,10 +626,8 @@ public abstract class GunItem extends Item implements CustomRendererItem {
float headshot = (float) data.headshot();
float damage = (float) data.damage();
float velocity = (float) (data.velocity() * perkSpeed(data));
float velocity = (float) data.velocity();
float bypassArmorRate = (float) data.bypassArmor();
var perkInstance = data.perk.getInstance(Perk.Type.AMMO);
var perk = perkInstance != null ? perkInstance.perk() : null;
ProjectileEntity projectile = new ProjectileEntity(player.level())
.shooter(player)
@ -648,28 +641,14 @@ public abstract class GunItem extends Item implements CustomRendererItem {
var instance = data.perk.getInstance(type);
if (instance != null) {
instance.perk().modifyProjectile(data, instance, projectile);
if (instance.perk() instanceof AmmoPerk ammoPerk) {
velocity = (float) ammoPerk.getModifiedVelocity(data, instance);
}
}
}
if (perk == ModPerks.JHP_BULLET.get()) {
int level = data.perk.getLevel(perk);
projectile.jhpBullet(level);
} else if (perk == ModPerks.HE_BULLET.get()) {
int level = data.perk.getLevel(perk);
projectile.heBullet(level);
} else if (perk == ModPerks.INCENDIARY_BULLET.get()) {
int level = data.perk.getLevel(perk);
projectile.fireBullet(level, stack.is(ModTags.Items.SHOTGUN));
}
var dmgPerk = data.perk.get(Perk.Type.DAMAGE);
if (dmgPerk == ModPerks.MONSTER_HUNTER.get()) {
int level = data.perk.getLevel(dmgPerk);
projectile.monsterMultiple(0.1f + 0.1f * level);
}
projectile.setPos(player.getX() - 0.1 * player.getLookAngle().x, player.getEyeY() - 0.1 - 0.1 * player.getLookAngle().y, player.getZ() + -0.1 * player.getLookAngle().z);
projectile.shoot(player, player.getLookAngle().x, player.getLookAngle().y + 0.001f, player.getLookAngle().z, stack.is(ModTags.Items.SHOTGUN) && perk == ModPerks.INCENDIARY_BULLET.get() ? 4.5f : velocity, (float) spread);
projectile.shoot(player, player.getLookAngle().x, player.getLookAngle().y + 0.001f, player.getLookAngle().z, velocity, (float) spread);
player.level().addFreshEntity(projectile);
return true;

View file

@ -8,7 +8,6 @@ import com.atsuishio.superbwarfare.entity.projectile.JavelinMissileEntity;
import com.atsuishio.superbwarfare.entity.vehicle.base.VehicleEntity;
import com.atsuishio.superbwarfare.event.ClientEventHandler;
import com.atsuishio.superbwarfare.init.ModEnumExtensions;
import com.atsuishio.superbwarfare.init.ModPerks;
import com.atsuishio.superbwarfare.init.ModSounds;
import com.atsuishio.superbwarfare.item.gun.GunItem;
import com.atsuishio.superbwarfare.item.gun.data.GunData;
@ -237,10 +236,11 @@ public class JavelinItem extends GunItem implements GeoItem {
new Vec3(tag.getDouble("TargetPosX"), tag.getDouble("TargetPosY"), tag.getDouble("TargetPosZ"))
);
var dmgPerk = data.perk.get(Perk.Type.DAMAGE);
if (dmgPerk == ModPerks.MONSTER_HUNTER.get()) {
int perkLevel = data.perk.getLevel(dmgPerk);
missileEntity.setMonsterMultiplier(0.1f + 0.1f * perkLevel);
for (Perk.Type type : Perk.Type.values()) {
var instance = data.perk.getInstance(type);
if (instance != null) {
instance.perk().modifyProjectile(data, instance, missileEntity);
}
}
missileEntity.setPos(player.getX() + firePos.x, player.getEyeY() + firePos.y, player.getZ() + firePos.z);
@ -313,5 +313,4 @@ public class JavelinItem extends GunItem implements GeoItem {
tag.putBoolean("Seeking", true);
tag.putInt("SeekTime", 0);
}
}

View file

@ -131,10 +131,11 @@ public class M79Item extends GunItem implements GeoItem {
(float) data.explosionRadius()
);
var dmgPerk = data.perk.get(Perk.Type.DAMAGE);
if (dmgPerk == ModPerks.MONSTER_HUNTER.get()) {
int perkLevel = data.perk.getLevel(dmgPerk);
gunGrenadeEntity.setMonsterMultiplier(0.1f + 0.1f * perkLevel);
for (Perk.Type type : Perk.Type.values()) {
var instance = data.perk.getInstance(type);
if (instance != null) {
instance.perk().modifyProjectile(data, instance, gunGrenadeEntity);
}
}
gunGrenadeEntity.setNoGravity(data.perk.get(Perk.Type.AMMO) == ModPerks.MICRO_MISSILE.get());

View file

@ -156,10 +156,11 @@ public class RpgItem extends GunItem implements GeoItem {
(float) data.explosionRadius()
);
var dmgPerk = data.perk.get(Perk.Type.DAMAGE);
if (dmgPerk == ModPerks.MONSTER_HUNTER.get()) {
int perkLevel = data.perk.getLevel(dmgPerk);
rocket.setMonsterMultiplier(0.1f + 0.1f * perkLevel);
for (Perk.Type type : Perk.Type.values()) {
var instance = data.perk.getInstance(type);
if (instance != null) {
instance.perk().modifyProjectile(data, instance, rocket);
}
}
float velocity = (float) data.velocity();

View file

@ -248,10 +248,11 @@ public class SecondaryCataclysm extends GunItem implements GeoItem, EnergyStorag
(float) data.explosionRadius()
);
var dmgPerk = data.perk.get(Perk.Type.DAMAGE);
if (dmgPerk == ModPerks.MONSTER_HUNTER.get()) {
int perkLevel = data.perk.getLevel(dmgPerk);
gunGrenadeEntity.setMonsterMultiplier(0.1f + 0.1f * perkLevel);
for (Perk.Type type : Perk.Type.values()) {
var instance = data.perk.getInstance(type);
if (instance != null) {
instance.perk().modifyProjectile(data, instance, gunGrenadeEntity);
}
}
gunGrenadeEntity.setNoGravity(data.perk.get(Perk.Type.AMMO) == ModPerks.MICRO_MISSILE.get());

View file

@ -216,7 +216,7 @@ public class BocekItem extends GunItem implements GeoItem {
var perk = data.perk.get(Perk.Type.AMMO);
float headshot = (float) data.headshot();
float velocity = (float) (24 * power * (float) perkSpeed(data));
float velocity = (float) (24 * power);
float bypassArmorRate = (float) data.bypassArmor();
double damage;
@ -245,23 +245,6 @@ public class BocekItem extends GunItem implements GeoItem {
}
}
if (perk == ModPerks.JHP_BULLET.get()) {
int level = data.perk.getLevel(perk);
projectile.jhpBullet(level);
} else if (perk == ModPerks.HE_BULLET.get()) {
int level = data.perk.getLevel(perk);
projectile.heBullet(level);
} else if (perk == ModPerks.INCENDIARY_BULLET.get()) {
int level = data.perk.getLevel(perk);
projectile.fireBullet(level, !zoom);
}
var dmgPerk = data.perk.get(Perk.Type.DAMAGE);
if (dmgPerk == ModPerks.MONSTER_HUNTER.get()) {
int perkLevel = data.perk.getLevel(dmgPerk);
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);
projectile.shoot(player, player.getLookAngle().x, player.getLookAngle().y, player.getLookAngle().z, (!zoom && perk == ModPerks.INCENDIARY_BULLET.get() ? 0.2f : 1) * velocity, spread);
projectile.damage((float) damage);

View file

@ -52,6 +52,10 @@ public class AmmoPerk extends Perk {
return instance.level() - 1;
}
public double getModifiedVelocity(GunData data, PerkInstance instance) {
return data.velocity() * this.speedRate;
}
public static class Builder {
String descriptionId;

View file

@ -88,7 +88,7 @@ public class Perk {
return false;
}
public void modifyProjectile(GunData data, PerkInstance instance, Entity projectile) {
public void modifyProjectile(GunData data, PerkInstance instance, Entity entity) {
}
public enum Type {

View file

@ -0,0 +1,22 @@
package com.atsuishio.superbwarfare.perk.ammo;
import com.atsuishio.superbwarfare.entity.projectile.ProjectileEntity;
import com.atsuishio.superbwarfare.item.gun.data.GunData;
import com.atsuishio.superbwarfare.perk.AmmoPerk;
import com.atsuishio.superbwarfare.perk.Perk;
import com.atsuishio.superbwarfare.perk.PerkInstance;
import net.minecraft.world.entity.Entity;
public class HEBullet extends AmmoPerk {
public HEBullet() {
super(new AmmoPerk.Builder("he_bullet", Perk.Type.AMMO).bypassArmorRate(-0.3f).damageRate(0.5f).speedRate(0.85f).slug(true).rgb(240, 20, 10));
}
@Override
public void modifyProjectile(GunData data, PerkInstance instance, Entity entity) {
super.modifyProjectile(data, instance, entity);
if (!(entity instanceof ProjectileEntity projectile)) return;
projectile.heBullet(instance.level());
}
}

View file

@ -0,0 +1,28 @@
package com.atsuishio.superbwarfare.perk.ammo;
import com.atsuishio.superbwarfare.entity.projectile.ProjectileEntity;
import com.atsuishio.superbwarfare.init.ModTags;
import com.atsuishio.superbwarfare.item.gun.data.GunData;
import com.atsuishio.superbwarfare.perk.AmmoPerk;
import com.atsuishio.superbwarfare.perk.Perk;
import com.atsuishio.superbwarfare.perk.PerkInstance;
import net.minecraft.world.entity.Entity;
public class IncendiaryBullet extends AmmoPerk {
public IncendiaryBullet() {
super(new AmmoPerk.Builder("incendiary_bullet", Perk.Type.AMMO).bypassArmorRate(-0.4f).damageRate(0.7f).speedRate(0.75f).slug(false).rgb(230, 131, 65));
}
@Override
public void modifyProjectile(GunData data, PerkInstance instance, Entity entity) {
super.modifyProjectile(data, instance, entity);
if (!(entity instanceof ProjectileEntity projectile)) return;
projectile.fireBullet(instance.level(), data.stack.is(ModTags.Items.SHOTGUN));
}
@Override
public double getModifiedVelocity(GunData data, PerkInstance instance) {
return data.stack.is(ModTags.Items.SHOTGUN) ? 4.5f : super.getModifiedVelocity(data, instance);
}
}

View file

@ -0,0 +1,22 @@
package com.atsuishio.superbwarfare.perk.ammo;
import com.atsuishio.superbwarfare.entity.projectile.ProjectileEntity;
import com.atsuishio.superbwarfare.item.gun.data.GunData;
import com.atsuishio.superbwarfare.perk.AmmoPerk;
import com.atsuishio.superbwarfare.perk.Perk;
import com.atsuishio.superbwarfare.perk.PerkInstance;
import net.minecraft.world.entity.Entity;
public class JHPBullet extends AmmoPerk {
public JHPBullet() {
super(new AmmoPerk.Builder("jhp_bullet", Perk.Type.AMMO).bypassArmorRate(-0.2f).damageRate(1.1f).speedRate(0.95f).slug(true).rgb(230, 131, 65));
}
@Override
public void modifyProjectile(GunData data, PerkInstance instance, Entity entity) {
super.modifyProjectile(data, instance, entity);
if (!(entity instanceof ProjectileEntity projectile)) return;
projectile.jhpBullet(instance.level());
}
}

View file

@ -0,0 +1,31 @@
package com.atsuishio.superbwarfare.perk.damage;
import com.atsuishio.superbwarfare.entity.projectile.GunGrenadeEntity;
import com.atsuishio.superbwarfare.entity.projectile.JavelinMissileEntity;
import com.atsuishio.superbwarfare.entity.projectile.ProjectileEntity;
import com.atsuishio.superbwarfare.entity.projectile.RpgRocketEntity;
import com.atsuishio.superbwarfare.item.gun.data.GunData;
import com.atsuishio.superbwarfare.perk.Perk;
import com.atsuishio.superbwarfare.perk.PerkInstance;
import net.minecraft.world.entity.Entity;
public class MonsterHunter extends Perk {
public MonsterHunter() {
super("monster_hunter", Perk.Type.DAMAGE);
}
@Override
public void modifyProjectile(GunData data, PerkInstance instance, Entity entity) {
float multiplier = 0.1f + 0.1f * instance.level();
if (entity instanceof ProjectileEntity projectile) {
projectile.monsterMultiple(multiplier);
} else if (entity instanceof JavelinMissileEntity projectile) {
projectile.setMonsterMultiplier(multiplier);
} else if (entity instanceof GunGrenadeEntity projectile) {
projectile.setMonsterMultiplier(multiplier);
} else if (entity instanceof RpgRocketEntity projectile) {
projectile.setMonsterMultiplier(multiplier);
}
}
}