diff --git a/src/main/java/com/atsuishio/superbwarfare/init/ModPerks.java b/src/main/java/com/atsuishio/superbwarfare/init/ModPerks.java index 408cf7a35..7de527d14 100644 --- a/src/main/java/com/atsuishio/superbwarfare/init/ModPerks.java +++ b/src/main/java/com/atsuishio/superbwarfare/init/ModPerks.java @@ -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 AMMO_PERKS = DeferredRegister.create(Mod.loc("perk"), Mod.MODID); public static final DeferredHolder AP_BULLET = AMMO_PERKS.register("ap_bullet", APBullet::new); - public static final DeferredHolder 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 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 JHP_BULLET = AMMO_PERKS.register("jhp_bullet", JHPBullet::new); + public static final DeferredHolder HE_BULLET = AMMO_PERKS.register("he_bullet", HEBullet::new); public static final DeferredHolder SILVER_BULLET = AMMO_PERKS.register("silver_bullet", SilverBullet::new); public static final DeferredHolder 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 BEAST_BULLET = AMMO_PERKS.register("beast_bullet", BeastBullet::new); public static final DeferredHolder LONGER_WIRE = AMMO_PERKS.register("longer_wire", () -> new Perk("longer_wire", Perk.Type.AMMO)); - public static final DeferredHolder 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 INCENDIARY_BULLET = AMMO_PERKS.register("incendiary_bullet", IncendiaryBullet::new); public static final DeferredHolder 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 GUTSHOT_STRAIGHT = DAMAGE_PERKS.register("gutshot_straight", GutshotStraight::new); 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 MONSTER_HUNTER = DAMAGE_PERKS.register("monster_hunter", MonsterHunter::new); 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", Desperado::new); public static final DeferredHolder VORPAL_WEAPON = DAMAGE_PERKS.register("vorpal_weapon", VorpalWeapon::new); 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 33b1ef7d5..3ab2f4fbe 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/GunItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/GunItem.java @@ -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; diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/JavelinItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/JavelinItem.java index e6669710e..4decd2ce4 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/JavelinItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/JavelinItem.java @@ -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); } - } \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/M79Item.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/M79Item.java index 64be44318..56c0b93a7 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/M79Item.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/M79Item.java @@ -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()); diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/RpgItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/RpgItem.java index c4cd96163..072075a80 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/RpgItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/RpgItem.java @@ -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(); diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/SecondaryCataclysm.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/SecondaryCataclysm.java index 7c807d21c..0713bf030 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/SecondaryCataclysm.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/SecondaryCataclysm.java @@ -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()); diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/special/BocekItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/special/BocekItem.java index 154e5bf63..3f1c57bf8 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/special/BocekItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/special/BocekItem.java @@ -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); diff --git a/src/main/java/com/atsuishio/superbwarfare/perk/AmmoPerk.java b/src/main/java/com/atsuishio/superbwarfare/perk/AmmoPerk.java index 5b4ad6d1d..48d48d65e 100644 --- a/src/main/java/com/atsuishio/superbwarfare/perk/AmmoPerk.java +++ b/src/main/java/com/atsuishio/superbwarfare/perk/AmmoPerk.java @@ -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; diff --git a/src/main/java/com/atsuishio/superbwarfare/perk/Perk.java b/src/main/java/com/atsuishio/superbwarfare/perk/Perk.java index 50b2536b2..d389df77a 100644 --- a/src/main/java/com/atsuishio/superbwarfare/perk/Perk.java +++ b/src/main/java/com/atsuishio/superbwarfare/perk/Perk.java @@ -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 { diff --git a/src/main/java/com/atsuishio/superbwarfare/perk/ammo/HEBullet.java b/src/main/java/com/atsuishio/superbwarfare/perk/ammo/HEBullet.java new file mode 100644 index 000000000..3a8b9709c --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/perk/ammo/HEBullet.java @@ -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()); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/perk/ammo/IncendiaryBullet.java b/src/main/java/com/atsuishio/superbwarfare/perk/ammo/IncendiaryBullet.java new file mode 100644 index 000000000..9e6b8303d --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/perk/ammo/IncendiaryBullet.java @@ -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); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/perk/ammo/JHPBullet.java b/src/main/java/com/atsuishio/superbwarfare/perk/ammo/JHPBullet.java new file mode 100644 index 000000000..ab56303d6 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/perk/ammo/JHPBullet.java @@ -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()); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/perk/damage/MonsterHunter.java b/src/main/java/com/atsuishio/superbwarfare/perk/damage/MonsterHunter.java new file mode 100644 index 000000000..ada044334 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/perk/damage/MonsterHunter.java @@ -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); + } + } +}