正确实现micro missile perk效果

This commit is contained in:
17146 2025-03-11 04:08:42 +08:00
parent 1df4291026
commit a7a1ca56d8
9 changed files with 82 additions and 20 deletions

View file

@ -2,6 +2,8 @@ package com.atsuishio.superbwarfare.client.tooltip;
import com.atsuishio.superbwarfare.client.TooltipTool;
import com.atsuishio.superbwarfare.client.tooltip.component.GunImageComponent;
import com.atsuishio.superbwarfare.init.ModPerks;
import com.atsuishio.superbwarfare.perk.PerkHelper;
import com.atsuishio.superbwarfare.tools.FormatTool;
import com.atsuishio.superbwarfare.tools.GunsTool;
import net.minecraft.ChatFormatting;
@ -16,6 +18,9 @@ public class ClientLauncherImageTooltip extends ClientGunImageTooltip {
@Override
protected Component getDamageComponent() {
double damage = GunsTool.getGunDoubleTag(stack, "Damage", 0) * TooltipTool.perkDamage(stack);
int perkLevel = PerkHelper.getItemPerkLevel(ModPerks.MICRO_MISSILE.get(), stack);
if (perkLevel > 0) damage *= 1.1f + perkLevel * 0.1f;
double explosionDamage = GunsTool.getGunDoubleTag(stack, "ExplosionDamage", 0);
return Component.translatable("des.superbwarfare.guns.damage").withStyle(ChatFormatting.GRAY)

View file

@ -2,6 +2,8 @@ package com.atsuishio.superbwarfare.client.tooltip;
import com.atsuishio.superbwarfare.client.TooltipTool;
import com.atsuishio.superbwarfare.client.tooltip.component.GunImageComponent;
import com.atsuishio.superbwarfare.init.ModPerks;
import com.atsuishio.superbwarfare.perk.PerkHelper;
import com.atsuishio.superbwarfare.tools.FormatTool;
import com.atsuishio.superbwarfare.tools.GunsTool;
import net.minecraft.ChatFormatting;
@ -16,6 +18,9 @@ public class ClientSecondaryCataclysmImageTooltip extends ClientEnergyImageToolt
@Override
protected Component getDamageComponent() {
double damage = GunsTool.getGunDoubleTag(stack, "Damage", 0) * TooltipTool.perkDamage(stack);
int perkLevel = PerkHelper.getItemPerkLevel(ModPerks.MICRO_MISSILE.get(), stack);
if (perkLevel > 0) damage *= 1.1f + perkLevel * 0.1f;
double explosionDamage = GunsTool.getGunDoubleTag(stack, "ExplosionDamage", 0);
return Component.translatable("des.superbwarfare.guns.damage").withStyle(ChatFormatting.GRAY)

View file

@ -59,6 +59,22 @@ public class GunGrenadeEntity extends ThrowableItemProjectile implements GeoEnti
this(ModEntities.GUN_GRENADE.get(), level);
}
public void setDamage(float damage) {
this.damage = damage;
}
public void setExplosionDamage(float explosionDamage) {
this.explosionDamage = explosionDamage;
}
public void setExplosionRadius(float explosionRadius) {
this.explosionRadius = explosionRadius;
}
public void setCharged(boolean charged) {
this.charged = charged;
}
public void setMonsterMultiplier(float monsterMultiplier) {
this.monsterMultiplier = monsterMultiplier;
}

View file

@ -42,6 +42,7 @@ import software.bernie.geckolib.core.object.PlayState;
import software.bernie.geckolib.util.GeckoLibUtil;
public class RpgRocketEntity extends ThrowableItemProjectile implements GeoEntity {
public static final EntityDataAccessor<String> ANIMATION = SynchedEntityData.defineId(RpgRocketEntity.class, EntityDataSerializers.STRING);
private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this);
@ -49,25 +50,37 @@ public class RpgRocketEntity extends ThrowableItemProjectile implements GeoEntit
private float monsterMultiplier = 0.0f;
private float damage = 250f;
private float explosion_damage = 200f;
private float explosion_radius = 10f;
private float explosionDamage = 200f;
private float explosionRadius = 10f;
public RpgRocketEntity(EntityType<? extends RpgRocketEntity> type, Level world) {
super(type, world);
this.noCulling = true;
}
public RpgRocketEntity(LivingEntity entity, Level level, float damage, float explosion_damage, float explosion_radius) {
public RpgRocketEntity(LivingEntity entity, Level level, float damage, float explosionDamage, float explosionRadius) {
super(ModEntities.RPG_ROCKET.get(), entity, level);
this.damage = damage;
this.explosion_damage = explosion_damage;
this.explosion_radius = explosion_radius;
this.explosionDamage = explosionDamage;
this.explosionRadius = explosionRadius;
}
public RpgRocketEntity(PlayMessages.SpawnEntity spawnEntity, Level level) {
this(ModEntities.RPG_ROCKET.get(), level);
}
public void setDamage(float damage) {
this.damage = damage;
}
public void setExplosionDamage(float explosionDamage) {
this.explosionDamage = explosionDamage;
}
public void setExplosionRadius(float explosionRadius) {
this.explosionRadius = explosionRadius;
}
public void setMonsterMultiplier(float monsterMultiplier) {
this.monsterMultiplier = monsterMultiplier;
}
@ -112,7 +125,7 @@ public class RpgRocketEntity extends ThrowableItemProjectile implements GeoEntit
if (this.tickCount > 1) {
if (this.level() instanceof ServerLevel) {
ProjectileTool.causeCustomExplode(this, this.explosion_damage, this.explosion_radius, this.monsterMultiplier);
ProjectileTool.causeCustomExplode(this, this.explosionDamage, this.explosionRadius, this.monsterMultiplier);
}
}
@ -131,7 +144,7 @@ public class RpgRocketEntity extends ThrowableItemProjectile implements GeoEntit
if (this.tickCount > 1) {
if (this.level() instanceof ServerLevel) {
ProjectileTool.causeCustomExplode(this, this.explosion_damage, this.explosion_radius, this.monsterMultiplier);
ProjectileTool.causeCustomExplode(this, this.explosionDamage, this.explosionRadius, this.monsterMultiplier);
}
}
@ -158,7 +171,7 @@ public class RpgRocketEntity extends ThrowableItemProjectile implements GeoEntit
if (this.tickCount > 100 || this.isInWater()) {
if (this.level() instanceof ServerLevel) {
ProjectileTool.causeCustomExplode(this, this.explosion_damage, this.explosion_radius, this.monsterMultiplier);
ProjectileTool.causeCustomExplode(this, this.explosionDamage, this.explosionRadius, this.monsterMultiplier);
}
this.discard();
}

View file

@ -44,9 +44,8 @@ public class ModPerks {
public static final RegistryObject<Perk> LONGER_WIRE = AMMO_PERKS.register("longer_wire", () -> new Perk("longer_wire", Perk.Type.AMMO));
public static final RegistryObject<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 RegistryObject<Perk> MICRO_MISSILE = AMMO_PERKS.register("micro_missile",
() -> new AmmoPerk(new AmmoPerk.Builder("micro_missile", Perk.Type.AMMO).damageRate(1.25f).speedRate(1.2f)));
() -> new AmmoPerk(new AmmoPerk.Builder("micro_missile", Perk.Type.AMMO).speedRate(1.2f)));
/**

View file

@ -246,7 +246,6 @@ public class JavelinItem extends GunItem implements GeoItem, SpecialFireWeapon {
@Override
public boolean canApplyPerk(Perk perk) {
if (perk == ModPerks.MICRO_MISSILE.get()) return false;
return PerkHelper.LAUNCHER_PERKS.test(perk);
}

View file

@ -211,8 +211,16 @@ public class M79Item extends GunItem implements GeoItem, SpecialFireWeapon {
gunGrenadeEntity.setNoGravity(PerkHelper.getPerkByType(stack, Perk.Type.AMMO) == ModPerks.MICRO_MISSILE.get());
float velocity = (float) GunsTool.getGunDoubleTag(stack, "Velocity", 0);
int perkLevel = PerkHelper.getItemPerkLevel(ModPerks.MICRO_MISSILE.get(), stack);
if (perkLevel > 0) {
gunGrenadeEntity.setExplosionRadius((float) GunsTool.getGunDoubleTag(stack, "ExplosionRadius", 0) * 0.5f);
gunGrenadeEntity.setDamage((float) GunsTool.getGunDoubleTag(stack, "Damage", 0) * (1.1f + perkLevel * 0.1f));
velocity *= 1.2f;
}
gunGrenadeEntity.setPos(player.getX(), player.getEyeY() - 0.1, player.getZ());
gunGrenadeEntity.shoot(player.getLookAngle().x, player.getLookAngle().y, player.getLookAngle().z, (float) GunsTool.getGunDoubleTag(stack, "Velocity", 0),
gunGrenadeEntity.shoot(player.getLookAngle().x, player.getLookAngle().y, player.getLookAngle().z, velocity,
(float) (zooming ? 0.1 : spread));
serverLevel.addFreshEntity(gunGrenadeEntity);

View file

@ -185,7 +185,7 @@ public class RpgItem extends GunItem implements GeoItem, SpecialFireWeapon {
@Override
public boolean canApplyPerk(Perk perk) {
return PerkHelper.LAUNCHER_PERKS.test(perk);
return PerkHelper.LAUNCHER_PERKS.test(perk) || perk == ModPerks.MICRO_MISSILE.get();
}
@Override
@ -213,7 +213,7 @@ public class RpgItem extends GunItem implements GeoItem, SpecialFireWeapon {
double spread = GunsTool.getGunDoubleTag(stack, "Spread");
if (player.level() instanceof ServerLevel serverLevel) {
RpgRocketEntity rocketEntity = new RpgRocketEntity(player, level,
RpgRocketEntity rocket = new RpgRocketEntity(player, level,
(float) GunsTool.getGunDoubleTag(stack, "Damage", 0),
(float) GunsTool.getGunDoubleTag(stack, "ExplosionDamage", 0),
(float) GunsTool.getGunDoubleTag(stack, "ExplosionRadius", 0));
@ -221,17 +221,26 @@ public class RpgItem extends GunItem implements GeoItem, SpecialFireWeapon {
var dmgPerk = PerkHelper.getPerkByType(stack, Perk.Type.DAMAGE);
if (dmgPerk == ModPerks.MONSTER_HUNTER.get()) {
int perkLevel = PerkHelper.getItemPerkLevel(dmgPerk, stack);
rocketEntity.setMonsterMultiplier(0.1f + 0.1f * perkLevel);
rocket.setMonsterMultiplier(0.1f + 0.1f * perkLevel);
}
float velocity = (float) GunsTool.getGunDoubleTag(stack, "Velocity", 0);
if (PerkHelper.getPerkByType(stack, Perk.Type.AMMO) == ModPerks.MICRO_MISSILE.get()) {
rocketEntity.setNoGravity(true);
rocket.setNoGravity(true);
int perkLevel = PerkHelper.getItemPerkLevel(ModPerks.MICRO_MISSILE.get(), stack);
if (perkLevel > 0) {
rocket.setExplosionRadius((float) GunsTool.getGunDoubleTag(stack, "ExplosionRadius", 0) * 0.5f);
rocket.setDamage((float) GunsTool.getGunDoubleTag(stack, "Damage", 0) * (1.1f + perkLevel * 0.1f));
velocity *= 1.2f;
}
}
rocketEntity.setPos(player.getX(), player.getEyeY() - 0.1, player.getZ());
rocketEntity.shoot(player.getLookAngle().x, player.getLookAngle().y, player.getLookAngle().z, (float) GunsTool.getGunDoubleTag(stack, "Velocity", 0),
rocket.setPos(player.getX(), player.getEyeY() - 0.1, player.getZ());
rocket.shoot(player.getLookAngle().x, player.getLookAngle().y, player.getLookAngle().z, velocity,
(float) (zoom ? 0.1 : spread));
level.addFreshEntity(rocketEntity);
level.addFreshEntity(rocket);
ParticleTool.sendParticle(serverLevel, ParticleTypes.CLOUD, player.getX() + 1.8 * player.getLookAngle().x,
player.getY() + player.getBbHeight() - 0.1 + 1.8 * player.getLookAngle().y,

View file

@ -340,8 +340,16 @@ public class SecondaryCataclysm extends GunItem implements GeoItem, SpecialFireW
gunGrenadeEntity.setNoGravity(PerkHelper.getPerkByType(stack, Perk.Type.AMMO) == ModPerks.MICRO_MISSILE.get());
gunGrenadeEntity.charged(isChargedFire);
float velocity = (float) GunsTool.getGunDoubleTag(stack, "Velocity", 0);
int perkLevel = PerkHelper.getItemPerkLevel(ModPerks.MICRO_MISSILE.get(), stack);
if (perkLevel > 0) {
gunGrenadeEntity.setExplosionRadius((float) GunsTool.getGunDoubleTag(stack, "ExplosionRadius", 0) * 0.5f);
gunGrenadeEntity.setDamage((float) GunsTool.getGunDoubleTag(stack, "Damage", 0) * (1.1f + perkLevel * 0.1f));
velocity *= 1.2f;
}
gunGrenadeEntity.setPos(player.getX(), player.getEyeY() - 0.1, player.getZ());
gunGrenadeEntity.shoot(player.getLookAngle().x, player.getLookAngle().y, player.getLookAngle().z, (isChargedFire ? 4 : 1) * (float) GunsTool.getGunDoubleTag(stack, "Velocity", 0),
gunGrenadeEntity.shoot(player.getLookAngle().x, player.getLookAngle().y, player.getLookAngle().z, (isChargedFire ? 4 : 1) * velocity,
(float) (zooming ? 0.1 : spread));
serverLevel.addFreshEntity(gunGrenadeEntity);