添加子弹模组的额外属性

This commit is contained in:
Atsuihsio 2024-10-05 16:33:55 +08:00
parent 045745cc0f
commit d12e6c749f
14 changed files with 295 additions and 153 deletions

View file

@ -7,6 +7,9 @@ import net.mcreator.superbwarfare.config.client.DisplayConfig;
import net.mcreator.superbwarfare.event.ClientEventHandler; import net.mcreator.superbwarfare.event.ClientEventHandler;
import net.mcreator.superbwarfare.init.ModItems; import net.mcreator.superbwarfare.init.ModItems;
import net.mcreator.superbwarfare.init.ModTags; import net.mcreator.superbwarfare.init.ModTags;
import net.mcreator.superbwarfare.perk.AmmoPerk;
import net.mcreator.superbwarfare.perk.Perk;
import net.mcreator.superbwarfare.perk.PerkHelper;
import net.minecraft.client.CameraType; import net.minecraft.client.CameraType;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Font; import net.minecraft.client.gui.Font;
@ -53,6 +56,7 @@ public class CrossHairOverlay {
float deltaFrame = Minecraft.getInstance().getDeltaFrameTime(); float deltaFrame = Minecraft.getInstance().getDeltaFrameTime();
float moveX = 0; float moveX = 0;
float moveY = 0; float moveY = 0;
var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO);
if (DisplayConfig.FLOAT_CROSS_HAIR.get()) { if (DisplayConfig.FLOAT_CROSS_HAIR.get()) {
moveX = (float) (-6 * ClientEventHandler.turnRot[1] - (player.isSprinting() ? 10 : 6) * ClientEventHandler.movePosX); moveX = (float) (-6 * ClientEventHandler.turnRot[1] - (player.isSprinting() ? 10 : 6) * ClientEventHandler.movePosX);
@ -77,12 +81,13 @@ public class CrossHairOverlay {
preciseBlit(guiGraphics, ModUtils.loc("textures/screens/point.png"), w / 2f - 7.5f + moveX, h / 2f - 7.5f + moveY, 0, 0, 16, 16, 16, 16); preciseBlit(guiGraphics, ModUtils.loc("textures/screens/point.png"), w / 2f - 7.5f + moveX, h / 2f - 7.5f + moveY, 0, 0, 16, 16, 16, 16);
if (!player.isSprinting() || player.getPersistentData().getDouble("noRun") > 0) { if (!player.isSprinting() || player.getPersistentData().getDouble("noRun") > 0) {
if (stack.is(ModTags.Items.SHOTGUN)) { if (stack.is(ModTags.Items.SHOTGUN)) {
preciseBlit(guiGraphics, ModUtils.loc("textures/screens/shotgun_hud.png"), finPosX, finPosY, 0, 0.0F, finLength, finLength, finLength, finLength); if (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug) {
normalCrossHair(guiGraphics, w ,h , spread, moveX, moveY);
} else { } else {
preciseBlit(guiGraphics, REX_HORIZONTAL, (float) (w / 2f - 13.5f - 2.8f * spread) + moveX, h / 2f - 7.5f + moveY, 0, 0, 16, 16, 16, 16); shotgunCrossHair(guiGraphics, finPosX, finPosY, finLength);
preciseBlit(guiGraphics, REX_HORIZONTAL, (float) (w / 2f - 2.5f + 2.8f * spread) + moveX, h / 2f - 7.5f + moveY, 0, 0, 16, 16, 16, 16); }
preciseBlit(guiGraphics, REX_VERTICAL, w / 2f - 7.5f + moveX, (float) (h / 2f - 2.5f + 2.8f * spread) + moveY, 0, 0, 16, 16, 16, 16); } else {
preciseBlit(guiGraphics, REX_VERTICAL, w / 2f - 7.5f + moveX, (float) (h / 2f - 13.5f - 2.8f * spread) + moveY, 0, 0, 16, 16, 16, 16); normalCrossHair(guiGraphics, w ,h , spread, moveX, moveY);
} }
} }
} }
@ -92,17 +97,20 @@ public class CrossHairOverlay {
preciseBlit(guiGraphics, ModUtils.loc("textures/screens/point.png"), w / 2f - 7.5f + moveX, h / 2f - 7.5f + moveY, 0, 0, 16, 16, 16, 16); preciseBlit(guiGraphics, ModUtils.loc("textures/screens/point.png"), w / 2f - 7.5f + moveX, h / 2f - 7.5f + moveY, 0, 0, 16, 16, 16, 16);
if (!player.isSprinting() || player.getPersistentData().getDouble("noRun") > 0 || ClientEventHandler.pullPos > 0) { if (!player.isSprinting() || player.getPersistentData().getDouble("noRun") > 0 || ClientEventHandler.pullPos > 0) {
if (ClientEventHandler.zoomTime < 0.1) { if (ClientEventHandler.zoomTime < 0.1) {
preciseBlit(guiGraphics, ModUtils.loc("textures/screens/shotgun_hud.png"), finPosX, finPosY, 0, 0.0F, finLength, finLength, finLength, finLength); if (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug) {
normalCrossHair(guiGraphics, w ,h , spread, moveX, moveY);
} else { } else {
preciseBlit(guiGraphics, REX_HORIZONTAL, (float) (w / 2f - 13.5f - 2.8f * spread) + moveX, h / 2f - 7.5f + moveY, 0, 0, 16, 16, 16, 16); shotgunCrossHair(guiGraphics, finPosX, finPosY, finLength);
preciseBlit(guiGraphics, REX_HORIZONTAL, (float) (w / 2f - 2.5f + 2.8f * spread) + moveX, h / 2f - 7.5f + moveY, 0, 0, 16, 16, 16, 16); }
preciseBlit(guiGraphics, REX_VERTICAL, w / 2f - 7.5f + moveX, (float) (h / 2f - 2.5f + 2.8f * spread) + moveY, 0, 0, 16, 16, 16, 16); } else {
preciseBlit(guiGraphics, REX_VERTICAL, w / 2f - 7.5f + moveX, (float) (h / 2f - 13.5f - 2.8f * spread) + moveY, 0, 0, 16, 16, 16, 16); normalCrossHair(guiGraphics, w ,h , spread, moveX, moveY);
} }
} }
} }
} }
// 在开启伤害指示器时才进行渲染 // 在开启伤害指示器时才进行渲染
if (DisplayConfig.KILL_INDICATION.get()) { if (DisplayConfig.KILL_INDICATION.get()) {
renderKillIndicator(guiGraphics, w, h, moveX, moveY); renderKillIndicator(guiGraphics, w, h, moveX, moveY);
@ -125,6 +133,17 @@ public class CrossHairOverlay {
} }
private static void normalCrossHair(GuiGraphics guiGraphics, int w, int h, double spread, float moveX, float moveY ) {
preciseBlit(guiGraphics, REX_HORIZONTAL, (float) (w / 2f - 13.5f - 2.8f * spread) + moveX, h / 2f - 7.5f + moveY, 0, 0, 16, 16, 16, 16);
preciseBlit(guiGraphics, REX_HORIZONTAL, (float) (w / 2f - 2.5f + 2.8f * spread) + moveX, h / 2f - 7.5f + moveY, 0, 0, 16, 16, 16, 16);
preciseBlit(guiGraphics, REX_VERTICAL, w / 2f - 7.5f + moveX, (float) (h / 2f - 2.5f + 2.8f * spread) + moveY, 0, 0, 16, 16, 16, 16);
preciseBlit(guiGraphics, REX_VERTICAL, w / 2f - 7.5f + moveX, (float) (h / 2f - 13.5f - 2.8f * spread) + moveY, 0, 0, 16, 16, 16, 16);
}
private static void shotgunCrossHair(GuiGraphics guiGraphics, float finPosX, float finPosY, float finLength) {
preciseBlit(guiGraphics, ModUtils.loc("textures/screens/shotgun_hud.png"), finPosX, finPosY, 0, 0.0F, finLength, finLength, finLength, finLength);
}
private static boolean shouldRenderCrossHair(Player player) { private static boolean shouldRenderCrossHair(Player player) {
if (player == null) return false; if (player == null) return false;

View file

@ -340,7 +340,7 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa
this.onHitBlock(hitVec); this.onHitBlock(hitVec);
if (heBullet) { if (heBullet) {
explosionBulletBlock(this, damage, heLevel, monsterMultiple + 1, hitVec); explosionBulletBlock(this, this.damage, heLevel, monsterMultiple + 1, hitVec);
} }
} }
@ -363,8 +363,8 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa
protected void explosionBulletBlock(Entity projectile , float damage, int heLevel, float monsterMultiple, Vec3 hitVec) { protected void explosionBulletBlock(Entity projectile , float damage, int heLevel, float monsterMultiple, Vec3 hitVec) {
CustomExplosion explosion = new CustomExplosion(projectile.level(), projectile, CustomExplosion explosion = new CustomExplosion(projectile.level(), projectile,
ModDamageTypes.causeProjectileBoomDamage(projectile.level().registryAccess(), projectile, this.getShooter()), (float) ((2 + 0.1 * damage) * (1 + 0.1 * heLevel)), ModDamageTypes.causeProjectileBoomDamage(projectile.level().registryAccess(), projectile, this.getShooter()), (float) ((0.9 * damage) * (1 + 0.1 * heLevel)),
hitVec.x, hitVec.y, hitVec.z, (float)((2.5 + 0.01 * damage) * (1 + 0.05 * heLevel)) , Explosion.BlockInteraction.KEEP).setDamageMultiplier(monsterMultiple); hitVec.x, hitVec.y, hitVec.z, (float)((1.5 + 0.02 * damage) * (1 + 0.05 * heLevel)) , Explosion.BlockInteraction.KEEP).setDamageMultiplier(monsterMultiple);
explosion.explode(); explosion.explode();
net.minecraftforge.event.ForgeEventFactory.onExplosionStart(projectile.level(), explosion); net.minecraftforge.event.ForgeEventFactory.onExplosionStart(projectile.level(), explosion);
explosion.finalizeExplosion(false); explosion.finalizeExplosion(false);
@ -502,7 +502,7 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa
} }
if (heBullet) { if (heBullet) {
explosionBulletEntity(this, entity, damage, heLevel, mMultiple); explosionBulletEntity(this, entity, this.damage, heLevel, mMultiple);
} }
if (headshot) { if (headshot) {
@ -546,8 +546,8 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa
protected void explosionBulletEntity(Entity projectile, Entity target, float damage, int heLevel, float monsterMultiple) { protected void explosionBulletEntity(Entity projectile, Entity target, float damage, int heLevel, float monsterMultiple) {
CustomExplosion explosion = new CustomExplosion(projectile.level(), projectile, CustomExplosion explosion = new CustomExplosion(projectile.level(), projectile,
ModDamageTypes.causeProjectileBoomDamage(projectile.level().registryAccess(), projectile, this.getShooter()), (float) ((2 + 0.1 * damage) * (1 + 0.1 * heLevel)), ModDamageTypes.causeProjectileBoomDamage(projectile.level().registryAccess(), projectile, this.getShooter()), (float) ((0.8 * damage) * (1 + 0.1 * heLevel)),
target.getX(), target.getY(), target.getZ(), (float)((2.5 + 0.01 * damage) * (1 + 0.05 * heLevel)) , Explosion.BlockInteraction.KEEP).setDamageMultiplier(monsterMultiple); target.getX(), target.getY(), target.getZ(), (float)((1.5 + 0.02 * damage) * (1 + 0.05 * heLevel)) , Explosion.BlockInteraction.KEEP).setDamageMultiplier(monsterMultiple);
explosion.explode(); explosion.explode();
net.minecraftforge.event.ForgeEventFactory.onExplosionStart(projectile.level(), explosion); net.minecraftforge.event.ForgeEventFactory.onExplosionStart(projectile.level(), explosion);
explosion.finalizeExplosion(false); explosion.finalizeExplosion(false);

View file

@ -6,10 +6,10 @@ import net.mcreator.superbwarfare.entity.DroneEntity;
import net.mcreator.superbwarfare.entity.ICannonEntity; import net.mcreator.superbwarfare.entity.ICannonEntity;
import net.mcreator.superbwarfare.init.ModItems; import net.mcreator.superbwarfare.init.ModItems;
import net.mcreator.superbwarfare.init.ModMobEffects; import net.mcreator.superbwarfare.init.ModMobEffects;
import net.mcreator.superbwarfare.init.ModPerks;
import net.mcreator.superbwarfare.init.ModTags; import net.mcreator.superbwarfare.init.ModTags;
import net.mcreator.superbwarfare.network.ModVariables; import net.mcreator.superbwarfare.network.ModVariables;
import net.mcreator.superbwarfare.network.message.ShootMessage; import net.mcreator.superbwarfare.network.message.ShootMessage;
import net.mcreator.superbwarfare.perk.AmmoPerk;
import net.mcreator.superbwarfare.perk.Perk; import net.mcreator.superbwarfare.perk.Perk;
import net.mcreator.superbwarfare.perk.PerkHelper; import net.mcreator.superbwarfare.perk.PerkHelper;
import net.mcreator.superbwarfare.tools.MillisTimer; import net.mcreator.superbwarfare.tools.MillisTimer;
@ -162,7 +162,7 @@ public class ClientEventHandler {
if (stack.is(ModTags.Items.SNIPER_RIFLE)) { if (stack.is(ModTags.Items.SNIPER_RIFLE)) {
zoomSpread = 1 - (0.995 * zoomTime); zoomSpread = 1 - (0.995 * zoomTime);
} else if (stack.is(ModTags.Items.SHOTGUN)) { } else if (stack.is(ModTags.Items.SHOTGUN)) {
if (perk == ModPerks.HE_BULLET.get()) { if (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug) {
zoomSpread = 1 - (0.85 * zoomTime); zoomSpread = 1 - (0.85 * zoomTime);
} else { } else {
zoomSpread = 1 - (0.25 * zoomTime); zoomSpread = 1 - (0.25 * zoomTime);
@ -456,7 +456,7 @@ public class ClientEventHandler {
private static void handleWeaponZoom(LivingEntity entity) { private static void handleWeaponZoom(LivingEntity entity) {
if (!(entity instanceof Player player)) return; if (!(entity instanceof Player player)) return;
float times = 5 * Minecraft.getInstance().getDeltaFrameTime(); float times = 5 * Minecraft.getInstance().getDeltaFrameTime();
if (GLFW.glfwGetMouseButton(Minecraft.getInstance().getWindow().getWindow(), GLFW.GLFW_MOUSE_BUTTON_RIGHT) == GLFW.GLFW_PRESS && !notInGame() && !player.getCooldowns().isOnCooldown(player.getMainHandItem().getItem())) { if (GLFW.glfwGetMouseButton(Minecraft.getInstance().getWindow().getWindow(), GLFW.GLFW_MOUSE_BUTTON_RIGHT) == GLFW.GLFW_PRESS && !notInGame()) {
zoomTime = Mth.clamp(zoomTime + 0.03 * times, 0, 1); zoomTime = Mth.clamp(zoomTime + 0.03 * times, 0, 1);
} else { } else {
zoomTime = Mth.clamp(zoomTime - 0.04 * times, 0, 1); zoomTime = Mth.clamp(zoomTime - 0.04 * times, 0, 1);

View file

@ -194,19 +194,19 @@ public class GunEventHandler {
if (!player.level().isClientSide()) { if (!player.level().isClientSide()) {
float headshot = (float) heldItem.getOrCreateTag().getDouble("headshot"); float headshot = (float) heldItem.getOrCreateTag().getDouble("headshot");
float damage = (float) (heldItem.getOrCreateTag().getDouble("damage") + heldItem.getOrCreateTag().getDouble("sentinelChargeDamage")) * (float) heldItem.getOrCreateTag().getDouble("levelDamageMultiple"); float damage = (float) (heldItem.getOrCreateTag().getDouble("damage") + heldItem.getOrCreateTag().getDouble("sentinelChargeDamage")) * (float) heldItem.getOrCreateTag().getDouble("levelDamageMultiple") * (float) perkDamage(heldItem);
float velocity = (float) heldItem.getOrCreateTag().getDouble("velocity"); float velocity = (float) heldItem.getOrCreateTag().getDouble("velocity") * (float) perkSpeed(heldItem);
int projectileAmount = (int) heldItem.getOrCreateTag().getDouble("projectile_amount");
float bypassArmorRate = (float) heldItem.getOrCreateTag().getDouble("BypassesArmor");
boolean zoom = player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables()).zoom; boolean zoom = player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables()).zoom;
var perk = PerkHelper.getPerkByType(heldItem, Perk.Type.AMMO); var perk = PerkHelper.getPerkByType(heldItem, Perk.Type.AMMO);
ProjectileEntity projectile = new ProjectileEntity(player.level()) ProjectileEntity projectile = new ProjectileEntity(player.level())
.shooter(player) .shooter(player)
.damage((perk == ModPerks.HE_BULLET.get() ? (int)heldItem.getOrCreateTag().getDouble("projectile_amount") * damage : damage)) .damage(perk instanceof AmmoPerk ammoPerk && ammoPerk.slug ? projectileAmount * damage : damage)
.headShot(headshot) .headShot(headshot)
.zoom(zoom); .zoom(zoom);
float bypassArmorRate = (float) heldItem.getOrCreateTag().getDouble("BypassesArmor");
if (perk instanceof AmmoPerk ammoPerk) { if (perk instanceof AmmoPerk ammoPerk) {
int level = PerkHelper.getItemPerkLevel(perk, heldItem); int level = PerkHelper.getItemPerkLevel(perk, heldItem);
@ -239,7 +239,6 @@ public class GunEventHandler {
} else if (perk == ModPerks.HE_BULLET.get()) { } else if (perk == ModPerks.HE_BULLET.get()) {
int level = PerkHelper.getItemPerkLevel(perk, heldItem); int level = PerkHelper.getItemPerkLevel(perk, heldItem);
projectile.heBullet(true, level); projectile.heBullet(true, level);
velocity *= 0.6f;
} }
var dmgPerk = PerkHelper.getPerkByType(heldItem, Perk.Type.DAMAGE); var dmgPerk = PerkHelper.getPerkByType(heldItem, Perk.Type.DAMAGE);
@ -255,6 +254,22 @@ public class GunEventHandler {
} }
} }
public static double perkDamage(ItemStack stack) {
var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO);
if (perk instanceof AmmoPerk ammoPerk) {
return ammoPerk.damageRate;
}
return 1;
}
public static double perkSpeed(ItemStack stack) {
var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO);
if (perk instanceof AmmoPerk ammoPerk) {
return ammoPerk.speedRate;
}
return 1;
}
/** /**
* 通用的武器换弹流程 * 通用的武器换弹流程
*/ */

View file

@ -9,6 +9,8 @@ import net.mcreator.superbwarfare.item.gun.GunItem;
import net.mcreator.superbwarfare.network.ModVariables; import net.mcreator.superbwarfare.network.ModVariables;
import net.mcreator.superbwarfare.network.message.ClientIndicatorMessage; import net.mcreator.superbwarfare.network.message.ClientIndicatorMessage;
import net.mcreator.superbwarfare.network.message.PlayerGunKillMessage; import net.mcreator.superbwarfare.network.message.PlayerGunKillMessage;
import net.mcreator.superbwarfare.perk.AmmoPerk;
import net.mcreator.superbwarfare.perk.Perk;
import net.mcreator.superbwarfare.perk.PerkHelper; import net.mcreator.superbwarfare.perk.PerkHelper;
import net.mcreator.superbwarfare.tools.DamageTypeTool; import net.mcreator.superbwarfare.tools.DamageTypeTool;
import net.mcreator.superbwarfare.tools.SoundTool; import net.mcreator.superbwarfare.tools.SoundTool;
@ -117,21 +119,26 @@ public class LivingEventHandler {
double damage = amount; double damage = amount;
ItemStack stack = sourceEntity instanceof LivingEntity living ? living.getMainHandItem() : ItemStack.EMPTY; ItemStack stack = sourceEntity instanceof LivingEntity living ? living.getMainHandItem() : ItemStack.EMPTY;
var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO);
//距离衰减 //距离衰减
if (DamageTypeTool.isGunDamage(source)) { if (DamageTypeTool.isGunDamage(source)) {
double distance = entity.position().distanceTo(sourceEntity.position()); double distance = entity.position().distanceTo(sourceEntity.position());
if (stack.is(ModTags.Items.USE_SHOTGUN_AMMO)) { if (stack.is(ModTags.Items.USE_SHOTGUN_AMMO)) {
if (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug) {
damage = reduceDamageByDistance(amount, distance, 0.015, 50);
} else {
damage = reduceDamageByDistance(amount, distance, 0.03, 25); damage = reduceDamageByDistance(amount, distance, 0.03, 25);
}
} else if (stack.is(ModTags.Items.USE_SNIPER_AMMO)) { } else if (stack.is(ModTags.Items.USE_SNIPER_AMMO)) {
damage = reduceDamageByDistance(amount, distance, 0.001, 200); damage = reduceDamageByDistance(amount, distance, 0.001, 150);
} else if (stack.is(ModTags.Items.USE_HANDGUN_AMMO)) { } else if (stack.is(ModTags.Items.USE_HANDGUN_AMMO)) {
damage = reduceDamageByDistance(amount, distance, 0.03, 50); damage = reduceDamageByDistance(amount, distance, 0.02, 50);
} else if (stack.is(ModTags.Items.SMG)) { } else if (stack.is(ModTags.Items.SMG)) {
damage = reduceDamageByDistance(amount, distance, 0.03, 50); damage = reduceDamageByDistance(amount, distance, 0.02, 50);
} else if (stack.is(ModTags.Items.USE_RIFLE_AMMO) || stack.getItem() == ModItems.BOCEK.get()) { } else if (stack.is(ModTags.Items.USE_RIFLE_AMMO) || stack.getItem() == ModItems.BOCEK.get()) {
damage = reduceDamageByDistance(amount, distance, 0.0025, 150); damage = reduceDamageByDistance(amount, distance, 0.007, 100);
} }
} }
@ -159,7 +166,7 @@ public class LivingEventHandler {
event.setAmount((float) damage); event.setAmount((float) damage);
if (entity instanceof TargetEntity && sourceEntity instanceof Player player) { if (entity instanceof TargetEntity && sourceEntity instanceof Player player) {
player.displayClientMessage(Component.literal("Damage:" + new DecimalFormat("##.#").format(damage) + player.displayClientMessage(Component.literal("Damage:" + new DecimalFormat("##.##").format(damage) +
" Distance:" + new DecimalFormat("##.#").format(entity.position().distanceTo(sourceEntity.position())) + "M"), false); " Distance:" + new DecimalFormat("##.#").format(entity.position().distanceTo(sourceEntity.position())) + "M"), false);
} }
} }

View file

@ -29,15 +29,15 @@ public class ModPerks {
public static final DeferredRegister<Perk> AMMO_PERKS = DeferredRegister.create(new ResourceLocation(ModUtils.MODID, "perk"), ModUtils.MODID); public static final DeferredRegister<Perk> AMMO_PERKS = DeferredRegister.create(new ResourceLocation(ModUtils.MODID, "perk"), ModUtils.MODID);
public static final RegistryObject<Perk> AP_BULLET = AMMO_PERKS.register("ap_bullet", public static final RegistryObject<Perk> AP_BULLET = AMMO_PERKS.register("ap_bullet",
() -> new AmmoPerk(new AmmoPerk.Builder("ap_bullet", Perk.Type.AMMO).bypassArmorRate(0.4f).rgb(230, 70, 35))); () -> new AmmoPerk(new AmmoPerk.Builder("ap_bullet", Perk.Type.AMMO).bypassArmorRate(0.4f).damageRate(0.9f).speedRate(1.2f).slug(true).rgb(230, 70, 35)));
public static final RegistryObject<Perk> JHP_BULLET = AMMO_PERKS.register("jhp_bullet", public static final RegistryObject<Perk> JHP_BULLET = AMMO_PERKS.register("jhp_bullet",
() -> new AmmoPerk(new AmmoPerk.Builder("jhp_bullet", Perk.Type.AMMO).bypassArmorRate(-0.2f).rgb(230, 131, 65))); () -> new AmmoPerk(new AmmoPerk.Builder("jhp_bullet", Perk.Type.AMMO).bypassArmorRate(-0.2f).damageRate(1.1f).speedRate(0.9f).slug(true).rgb(230, 131, 65)));
public static final RegistryObject<Perk> HE_BULLET = AMMO_PERKS.register("he_bullet", public static final RegistryObject<Perk> HE_BULLET = AMMO_PERKS.register("he_bullet",
() -> new AmmoPerk(new AmmoPerk.Builder("he_bullet", Perk.Type.AMMO).bypassArmorRate(-0.3f).rgb(240, 20, 10))); () -> new AmmoPerk(new AmmoPerk.Builder("he_bullet", Perk.Type.AMMO).bypassArmorRate(-0.3f).damageRate(0.5f).speedRate(0.6f).slug(true).rgb(240, 20, 10)));
public static final RegistryObject<Perk> SILVER_BULLET = AMMO_PERKS.register("silver_bullet", public static final RegistryObject<Perk> SILVER_BULLET = AMMO_PERKS.register("silver_bullet",
() -> new AmmoPerk(new AmmoPerk.Builder("silver_bullet", Perk.Type.AMMO).bypassArmorRate(0.05f).rgb(87, 166, 219))); () -> new AmmoPerk(new AmmoPerk.Builder("silver_bullet", Perk.Type.AMMO).bypassArmorRate(0.05f).damageRate(0.8f).speedRate(1.1f).rgb(87, 166, 219)));
public static final RegistryObject<Perk> POISONOUS_BULLET = AMMO_PERKS.register("poisonous_bullet", public static final RegistryObject<Perk> POISONOUS_BULLET = AMMO_PERKS.register("poisonous_bullet",
() -> new AmmoPerk(new AmmoPerk.Builder("poisonous_bullet", Perk.Type.AMMO).bypassArmorRate(0.0f).rgb(48, 131, 6) () -> 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))); .mobEffect(() -> MobEffects.POISON)));
public static final RegistryObject<Perk> BEAST_BULLET = AMMO_PERKS.register("beast_bullet", public static final RegistryObject<Perk> BEAST_BULLET = AMMO_PERKS.register("beast_bullet",
() -> new AmmoPerk(new AmmoPerk.Builder("beast_bullet", Perk.Type.AMMO).bypassArmorRate(0.0f).rgb(134, 65, 14))); () -> new AmmoPerk(new AmmoPerk.Builder("beast_bullet", Perk.Type.AMMO).bypassArmorRate(0.0f).rgb(134, 65, 14)));
@ -69,11 +69,11 @@ public class ModPerks {
public static void registerCompatPerks() { public static void registerCompatPerks() {
if (ModList.get().isLoaded(CompatHolder.DMV)) { if (ModList.get().isLoaded(CompatHolder.DMV)) {
AMMO_PERKS.register("blade_bullet", () -> new AmmoPerk(new AmmoPerk.Builder("blade_bullet", Perk.Type.AMMO) AMMO_PERKS.register("blade_bullet", () -> new AmmoPerk(new AmmoPerk.Builder("blade_bullet", Perk.Type.AMMO)
.bypassArmorRate(-0.2f).rgb(0xB4, 0x4B, 0x88).mobEffect(() -> CompatHolder.DMV_BLEEDING))); .bypassArmorRate(-0.2f).damageRate(0.7f).speedRate(0.8f).rgb(0xB4, 0x4B, 0x88).mobEffect(() -> CompatHolder.DMV_BLEEDING)));
} }
if (ModList.get().isLoaded(CompatHolder.VRC)) { if (ModList.get().isLoaded(CompatHolder.VRC)) {
AMMO_PERKS.register("curse_flame_bullet", () -> new AmmoPerk(new AmmoPerk.Builder("curse_flame_bullet", Perk.Type.AMMO) AMMO_PERKS.register("curse_flame_bullet", () -> new AmmoPerk(new AmmoPerk.Builder("curse_flame_bullet", Perk.Type.AMMO)
.bypassArmorRate(0.0f).rgb(0xB1, 0xC1, 0xF2).mobEffect(() -> CompatHolder.VRC_CURSE_FLAME))); .bypassArmorRate(0.0f).damageRate(1.2f).speedRate(0.9f).rgb(0xB1, 0xC1, 0xF2).mobEffect(() -> CompatHolder.VRC_CURSE_FLAME)));
} }
} }

View file

@ -1,5 +1,6 @@
package net.mcreator.superbwarfare.item; package net.mcreator.superbwarfare.item;
import net.mcreator.superbwarfare.perk.AmmoPerk;
import net.mcreator.superbwarfare.perk.Perk; import net.mcreator.superbwarfare.perk.Perk;
import net.minecraft.ChatFormatting; import net.minecraft.ChatFormatting;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
@ -42,5 +43,22 @@ public class PerkItem extends Item {
tooltips.add(Component.literal("")); tooltips.add(Component.literal(""));
tooltips.add(Component.translatable("perk.superbwarfare.slot").withStyle(ChatFormatting.GOLD) tooltips.add(Component.translatable("perk.superbwarfare.slot").withStyle(ChatFormatting.GOLD)
.append(Component.translatable("perk.superbwarfare.slot_" + this.getPerk().type.getName()).withStyle(chatFormatting))); .append(Component.translatable("perk.superbwarfare.slot_" + this.getPerk().type.getName()).withStyle(chatFormatting)));
if (this.getPerk() instanceof AmmoPerk ammoPerk) {
if (ammoPerk.damageRate < 1) {
tooltips.add(Component.translatable("des.superbwarfare.perk_damage_reduce").withStyle(ChatFormatting.RED));
} else if (ammoPerk.damageRate > 1) {
tooltips.add(Component.translatable("des.superbwarfare.perk_damage_plus").withStyle(ChatFormatting.GREEN));
}
if (ammoPerk.speedRate < 1) {
tooltips.add(Component.translatable("des.superbwarfare.perk_speed_reduce").withStyle(ChatFormatting.RED));
} else if (ammoPerk.speedRate > 1) {
tooltips.add(Component.translatable("des.superbwarfare.perk_speed_plus").withStyle(ChatFormatting.GREEN));
}
if (ammoPerk.slug) {
tooltips.add(Component.translatable("des.superbwarfare.perk_slug").withStyle(ChatFormatting.YELLOW));
}
}
} }
} }

View file

@ -174,10 +174,27 @@ public class FireMessage {
} }
} }
private static void handleBowShoot(Player player) { public static double perkDamage(ItemStack stack) {
ItemStack stack = player.getMainHandItem(); var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO);
if (perk instanceof AmmoPerk ammoPerk) {
return ammoPerk.damageRate;
}
return 1;
}
double power = stack.getOrCreateTag().getDouble("power"); public static double perkSpeed(ItemStack stack) {
var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO);
if (perk instanceof AmmoPerk ammoPerk) {
return ammoPerk.speedRate;
}
return 1;
}
private static void handleBowShoot(Player player) {
if (player.level().isClientSide()) return;
ItemStack stack = player.getMainHandItem();
var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO);
if (player instanceof ServerPlayer serverPlayer) { if (player instanceof ServerPlayer serverPlayer) {
SoundTool.stopSound(serverPlayer, ModSounds.BOCEK_PULL_1P.getId(), SoundSource.PLAYERS); SoundTool.stopSound(serverPlayer, ModSounds.BOCEK_PULL_1P.getId(), SoundSource.PLAYERS);
@ -187,96 +204,22 @@ public class FireMessage {
if (stack.getOrCreateTag().getDouble("power") >= 6) { if (stack.getOrCreateTag().getDouble("power") >= 6) {
stack.getOrCreateTag().putDouble("speed", stack.getOrCreateTag().getDouble("power")); stack.getOrCreateTag().putDouble("speed", stack.getOrCreateTag().getDouble("power"));
if ((player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables())).zoom) { if ((player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables())).zoom) {
Level plevel = player.level();
if (!plevel.isClientSide()) {
ItemStack heldItem = player.getMainHandItem();
if (player.level().isClientSide()) return; spawnBullet(player);
spawnFakeArrow(player);
CompoundTag tag = heldItem.getOrCreateTag();
double damage;
float headshot = (float) tag.getDouble("headshot");
float velocity = 2 * (float) tag.getDouble("speed");
boolean zoom = player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables()).zoom;
float bypassArmorRate = (float) heldItem.getOrCreateTag().getDouble("BypassesArmor");
ProjectileEntity projectile = new ProjectileEntity(player.level())
.shooter(player)
.headShot(headshot)
.zoom(zoom);
var perk = PerkHelper.getPerkByType(heldItem, Perk.Type.AMMO);
if (perk instanceof AmmoPerk ammoPerk) {
int level = PerkHelper.getItemPerkLevel(perk, heldItem);
bypassArmorRate += ammoPerk.bypassArmorRate + (perk == ModPerks.AP_BULLET.get() ? 0.05f * (level - 1) : 0);
projectile.setRGB(ammoPerk.rgb);
if (ammoPerk.mobEffect.get() != null) {
projectile.effect(() -> new MobEffectInstance(ammoPerk.mobEffect.get(), 70 + 30 * level, level - 1));
}
}
bypassArmorRate = Math.max(bypassArmorRate, 0);
projectile.bypassArmorRate(bypassArmorRate);
if (perk == ModPerks.SILVER_BULLET.get()) {
int level = PerkHelper.getItemPerkLevel(perk, heldItem);
projectile.undeadMultiple(1.0f + 0.5f * level);
} else if (perk == ModPerks.BEAST_BULLET.get()) {
projectile.beast();
} else if (perk == ModPerks.JHP_BULLET.get()) {
int level = PerkHelper.getItemPerkLevel(perk, heldItem);
projectile.jhpBullet(true, level);
} else if (perk == ModPerks.HE_BULLET.get()) {
int level = PerkHelper.getItemPerkLevel(perk, heldItem);
projectile.heBullet(true, level);
velocity *= 0.6f;
}
var dmgPerk = PerkHelper.getPerkByType(heldItem, Perk.Type.DAMAGE);
if (dmgPerk == ModPerks.MONSTER_HUNTER.get()) {
int perkLevel = PerkHelper.getItemPerkLevel(dmgPerk, heldItem);
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);
damage = 0.08333333 * tag.getDouble("damage") * tag.getDouble("speed") * tag.getDouble("levelDamageMultiple");
projectile.shoot(player.getLookAngle().x, player.getLookAngle().y, player.getLookAngle().z, velocity, 0);
projectile.damage((float) damage);
player.level().addFreshEntity(projectile);
BocekArrowEntity arrow = new BocekArrowEntity(player, plevel);
arrow.setBaseDamage(0);
arrow.setKnockback(0);
arrow.setSilent(true);
arrow.setPierceLevel((byte) 2);
arrow.pickup = AbstractArrow.Pickup.DISALLOWED;
arrow.setPos(player.getX(), player.getEyeY() - 0.1, player.getZ());
arrow.shoot(player.getLookAngle().x, player.getLookAngle().y, player.getLookAngle().z, (float) (2 * power), 0);
plevel.addFreshEntity(arrow);
}
if (!player.level().isClientSide()) {
SoundTool.playLocalSound(player, ModSounds.BOCEK_ZOOM_FIRE_1P.get(), 10, 1); SoundTool.playLocalSound(player, ModSounds.BOCEK_ZOOM_FIRE_1P.get(), 10, 1);
player.playSound(ModSounds.BOCEK_ZOOM_FIRE_3P.get(), 2, 1); player.playSound(ModSounds.BOCEK_ZOOM_FIRE_3P.get(), 2, 1);
}
} else {
var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO);
for (int index0 = 0; index0 < (perk == ModPerks.HE_BULLET.get() ? 1 : 10); index0++) { } else {
for (int index0 = 0; index0 < (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug ? 1 : 10); index0++) {
spawnBullet(player); spawnBullet(player);
} }
if (!player.level().isClientSide() && player.getServer() != null) {
SoundTool.playLocalSound(player, ModSounds.BOCEK_SHATTER_CAP_FIRE_1P.get(), 10, 1); SoundTool.playLocalSound(player, ModSounds.BOCEK_SHATTER_CAP_FIRE_1P.get(), 10, 1);
player.playSound(ModSounds.BOCEK_SHATTER_CAP_FIRE_3P.get(), 2, 1); player.playSound(ModSounds.BOCEK_SHATTER_CAP_FIRE_3P.get(), 2, 1);
} }
}
var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO);
if (perk == ModPerks.BEAST_BULLET.get()) { if (perk == ModPerks.BEAST_BULLET.get()) {
player.playSound(ModSounds.HENG.get(), 4f, 1f); player.playSound(ModSounds.HENG.get(), 4f, 1f);
@ -314,18 +257,30 @@ public class FireMessage {
if (player.level().isClientSide()) return; if (player.level().isClientSide()) return;
CompoundTag tag = heldItem.getOrCreateTag(); CompoundTag tag = heldItem.getOrCreateTag();
double damage; var perk = PerkHelper.getPerkByType(heldItem, Perk.Type.AMMO);
float headshot = (float) tag.getDouble("headshot"); float headshot = (float) tag.getDouble("headshot");
float velocity = 2 * (float) tag.getDouble("speed"); float velocity = 2 * (float) tag.getDouble("speed") * (float)perkSpeed(heldItem);
boolean zoom = player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables()).zoom;
float bypassArmorRate = (float) heldItem.getOrCreateTag().getDouble("BypassesArmor"); float bypassArmorRate = (float) heldItem.getOrCreateTag().getDouble("BypassesArmor");
double damage;
boolean zoom = player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables()).zoom;
float spread;
if ((player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables())).zoom) {
spread = 0.01f;
damage = 0.08333333 * tag.getDouble("damage") * tag.getDouble("speed") * tag.getDouble("levelDamageMultiple") * perkDamage(heldItem);
} else {
spread = perk instanceof AmmoPerk ammoPerk && ammoPerk.slug ? 1 : 2.5f;
damage = (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug ? 0.08333333 : 0.008333333) * tag.getDouble("damage") * tag.getDouble("speed") * tag.getDouble("levelDamageMultiple") * perkDamage(heldItem);
}
ProjectileEntity projectile = new ProjectileEntity(player.level()) ProjectileEntity projectile = new ProjectileEntity(player.level())
.shooter(player) .shooter(player)
.headShot(headshot) .headShot(headshot)
.zoom(zoom); .zoom(zoom);
var perk = PerkHelper.getPerkByType(heldItem, Perk.Type.AMMO);
if (perk instanceof AmmoPerk ammoPerk) { if (perk instanceof AmmoPerk ammoPerk) {
int level = PerkHelper.getItemPerkLevel(perk, heldItem); int level = PerkHelper.getItemPerkLevel(perk, heldItem);
@ -351,7 +306,6 @@ public class FireMessage {
} else if (perk == ModPerks.HE_BULLET.get()) { } else if (perk == ModPerks.HE_BULLET.get()) {
int level = PerkHelper.getItemPerkLevel(perk, heldItem); int level = PerkHelper.getItemPerkLevel(perk, heldItem);
projectile.heBullet(true, level); projectile.heBullet(true, level);
velocity *= 0.6f;
} }
var dmgPerk = PerkHelper.getPerkByType(heldItem, Perk.Type.DAMAGE); var dmgPerk = PerkHelper.getPerkByType(heldItem, Perk.Type.DAMAGE);
@ -362,12 +316,32 @@ public class FireMessage {
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.setPos(player.getX() - 0.1 * player.getLookAngle().x, player.getEyeY() - 0.1 - 0.1 * player.getLookAngle().y, player.getZ() + -0.1 * player.getLookAngle().z);
damage = 0.008333333 * tag.getDouble("damage") * tag.getDouble("speed") * tag.getDouble("levelDamageMultiple"); projectile.shoot(player.getLookAngle().x, player.getLookAngle().y, player.getLookAngle().z, velocity, spread);
projectile.shoot(player.getLookAngle().x, player.getLookAngle().y, player.getLookAngle().z, velocity, 2.5f);
projectile.damage((float) (perk == ModPerks.HE_BULLET.get() ? 10 * damage : damage)); projectile.damage((float) damage);
player.level().addFreshEntity(projectile); player.level().addFreshEntity(projectile);
} }
private static void spawnFakeArrow(Player player) {
ItemStack heldItem = player.getMainHandItem();
CompoundTag tag = heldItem.getOrCreateTag();
float velocity = 2 * (float) tag.getDouble("speed") * (float)perkSpeed(heldItem);
BocekArrowEntity arrow = new BocekArrowEntity(player, player.level());
arrow.setBaseDamage(0);
arrow.setKnockback(0);
arrow.setSilent(true);
arrow.setPierceLevel((byte) 2);
arrow.pickup = AbstractArrow.Pickup.DISALLOWED;
arrow.setPos(player.getX(), player.getEyeY() - 0.1, player.getZ());
arrow.shoot(player.getLookAngle().x, player.getLookAngle().y, player.getLookAngle().z, velocity, 0);
player.level().addFreshEntity(arrow);
}
private static void handleTaserFire(Player player) { private static void handleTaserFire(Player player) {
if (player.isSpectator()) return; if (player.isSpectator()) return;

View file

@ -6,6 +6,7 @@ import net.mcreator.superbwarfare.init.ModPerks;
import net.mcreator.superbwarfare.init.ModSounds; import net.mcreator.superbwarfare.init.ModSounds;
import net.mcreator.superbwarfare.init.ModTags; import net.mcreator.superbwarfare.init.ModTags;
import net.mcreator.superbwarfare.network.ModVariables; import net.mcreator.superbwarfare.network.ModVariables;
import net.mcreator.superbwarfare.perk.AmmoPerk;
import net.mcreator.superbwarfare.perk.Perk; import net.mcreator.superbwarfare.perk.Perk;
import net.mcreator.superbwarfare.perk.PerkHelper; import net.mcreator.superbwarfare.perk.PerkHelper;
import net.mcreator.superbwarfare.tools.ParticleTool; import net.mcreator.superbwarfare.tools.ParticleTool;
@ -67,6 +68,7 @@ public class ShootMessage {
int coolDownTick = (int) Math.ceil(20 / (rpm / 60)); int coolDownTick = (int) Math.ceil(20 / (rpm / 60));
double mode = stack.getOrCreateTag().getInt("fire_mode"); double mode = stack.getOrCreateTag().getInt("fire_mode");
int projectileAmount = (int) stack.getOrCreateTag().getDouble("projectile_amount");
if (((player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables())).holdFire || stack.getOrCreateTag().getInt("burst_fire") > 0) if (((player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables())).holdFire || stack.getOrCreateTag().getInt("burst_fire") > 0)
&& !(stack.getOrCreateTag().getBoolean("is_normal_reloading") || stack.getOrCreateTag().getBoolean("is_empty_reloading")) && !(stack.getOrCreateTag().getBoolean("is_normal_reloading") || stack.getOrCreateTag().getBoolean("is_empty_reloading"))
@ -154,7 +156,7 @@ public class ShootMessage {
var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO);
for (int index0 = 0; index0 < (perk == ModPerks.HE_BULLET.get() ? 1 : (int) stack.getOrCreateTag().getDouble("projectile_amount")); index0++) { for (int index0 = 0; index0 < (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug ? 1 : projectileAmount); index0++) {
gunShoot(player, spared); gunShoot(player, spared);
} }
@ -168,6 +170,8 @@ public class ShootMessage {
} else if (stack.is(ModItems.MINIGUN.get())) { } else if (stack.is(ModItems.MINIGUN.get())) {
var tag = stack.getOrCreateTag(); var tag = stack.getOrCreateTag();
int projectileAmount = (int) tag.getDouble("projectile_amount");
int count = 0; int count = 0;
for (var inv : player.getInventory().items) { for (var inv : player.getInventory().items) {
if (inv.is(ModItems.CREATIVE_AMMO_BOX.get())) { if (inv.is(ModItems.CREATIVE_AMMO_BOX.get())) {
@ -199,7 +203,7 @@ public class ShootMessage {
} }
} }
for (int index0 = 0; index0 < (perk == ModPerks.HE_BULLET.get() ? 1 : (int) stack.getOrCreateTag().getDouble("projectile_amount")); index0++) { for (int index0 = 0; index0 < (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug ? 1 : projectileAmount); index0++) {
gunShoot(player, spared); gunShoot(player, spared);
} }

View file

@ -7,12 +7,18 @@ import java.util.function.Supplier;
public class AmmoPerk extends Perk { public class AmmoPerk extends Perk {
public float bypassArmorRate; public float bypassArmorRate;
public float damageRate;
public float speedRate;
public boolean slug;
public float[] rgb; public float[] rgb;
public Supplier<MobEffect> mobEffect; public Supplier<MobEffect> mobEffect;
public AmmoPerk(AmmoPerk.Builder builder) { public AmmoPerk(AmmoPerk.Builder builder) {
super(builder.descriptionId, builder.type); super(builder.descriptionId, builder.type);
this.bypassArmorRate = builder.bypassArmorRate; this.bypassArmorRate = builder.bypassArmorRate;
this.damageRate = builder.damageRate;
this.speedRate = builder.speedRate;
this.slug = builder.slug;
this.rgb = builder.rgb; this.rgb = builder.rgb;
this.mobEffect = builder.mobEffect; this.mobEffect = builder.mobEffect;
} }
@ -21,6 +27,9 @@ public class AmmoPerk extends Perk {
String descriptionId; String descriptionId;
Type type; Type type;
float bypassArmorRate = 0.0f; float bypassArmorRate = 0.0f;
float damageRate = 1.0f;
float speedRate = 1.0f;
boolean slug = false;
float[] rgb = {1, 222 / 255f, 39 / 255f}; float[] rgb = {1, 222 / 255f, 39 / 255f};
public Supplier<MobEffect> mobEffect = () -> null; public Supplier<MobEffect> mobEffect = () -> null;
@ -34,6 +43,21 @@ public class AmmoPerk extends Perk {
return this; return this;
} }
public AmmoPerk.Builder damageRate(float damageRate) {
this.damageRate = Mth.clamp(damageRate, 0, Float.POSITIVE_INFINITY);
return this;
}
public AmmoPerk.Builder speedRate(float speedRate) {
this.speedRate = Mth.clamp(speedRate, 0, Float.POSITIVE_INFINITY);
return this;
}
public AmmoPerk.Builder slug(boolean slug) {
this.slug = slug;
return this;
}
public AmmoPerk.Builder rgb(int r, int g, int b) { public AmmoPerk.Builder rgb(int r, int g, int b) {
this.rgb[0] = r / 255f; this.rgb[0] = r / 255f;
this.rgb[1] = g / 255f; this.rgb[1] = g / 255f;

View file

@ -148,9 +148,9 @@ public class CustomExplosion extends Explosion {
double damageFinal = (damagePercent * damagePercent + damagePercent) / 2.0D * damage; double damageFinal = (damagePercent * damagePercent + damagePercent) / 2.0D * damage;
if (entity instanceof Monster monster) { if (entity instanceof Monster monster) {
monster.hurt(this.damageSource, (int) damageFinal * (1 + 0.2f * this.damageMultiplier)); monster.hurt(this.damageSource, (float) damageFinal * (1 + 0.2f * this.damageMultiplier));
} else { } else {
entity.hurt(this.damageSource, (float) ((int) damageFinal)); entity.hurt(this.damageSource, (float) damageFinal);
} }
if (entity instanceof LivingEntity) { if (entity instanceof LivingEntity) {
entity.invulnerableTime = 0; entity.invulnerableTime = 0;

View file

@ -28,15 +28,36 @@ public class TooltipTool {
} }
} }
public static double perkDamage(ItemStack stack) {
var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO);
if (perk instanceof AmmoPerk ammoPerk) {
return ammoPerk.damageRate;
}
return 1;
}
public static boolean heBullet(ItemStack stack) {
var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO);
return perk == ModPerks.HE_BULLET.get();
}
public static int heBulletLevel(ItemStack stack) {
var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO);
if (perk == ModPerks.HE_BULLET.get()) {
return PerkHelper.getItemPerkLevel(perk, stack);
}
return 0;
}
public static void addGunTips(List<Component> tooltip, ItemStack stack) { public static void addGunTips(List<Component> tooltip, ItemStack stack) {
tooltip.add(Component.literal("")); tooltip.add(Component.literal(""));
double damage = ItemNBTTool.getDouble(stack, "damage", 0) double damage = ItemNBTTool.getDouble(stack, "damage", 0)
* ItemNBTTool.getDouble(stack, "levelDamageMultiple", 1); * ItemNBTTool.getDouble(stack, "levelDamageMultiple", 1) * perkDamage(stack);
tooltip.add(Component.translatable("des.superbwarfare.tips.damage").withStyle(ChatFormatting.GRAY) tooltip.add(Component.translatable("des.superbwarfare.tips.damage").withStyle(ChatFormatting.GRAY)
.append(Component.literal("").withStyle(ChatFormatting.RESET)) .append(Component.literal("").withStyle(ChatFormatting.RESET))
.append(Component.literal(new DecimalFormat("##.#").format(damage)).withStyle(ChatFormatting.GREEN))); .append(Component.literal(new DecimalFormat("##.#").format(damage) + (heBullet(stack) ? " + " + new DecimalFormat("##.#").format(0.8 * damage * (1 + 0.1 * heBulletLevel(stack))) : "")).withStyle(ChatFormatting.GREEN)));
if (stack.is(ModTags.Items.IS_AUTO_WEAPON)) { if (stack.is(ModTags.Items.IS_AUTO_WEAPON)) {
addRpmTips(tooltip, stack); addRpmTips(tooltip, stack);
} }
@ -48,12 +69,29 @@ public class TooltipTool {
public static void addShotgunTips(List<Component> tooltip, ItemStack stack) { public static void addShotgunTips(List<Component> tooltip, ItemStack stack) {
tooltip.add(Component.literal("")); tooltip.add(Component.literal(""));
boolean slug = false;
var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO);
if (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug) {
slug = true;
}
if (slug) {
double damage = ItemNBTTool.getDouble(stack, "damage", 0) * ItemNBTTool.getDouble(stack, "projectile_amount", 0)
* ItemNBTTool.getDouble(stack, "levelDamageMultiple", 1) * perkDamage(stack);
tooltip.add(Component.translatable("des.superbwarfare.tips.damage").withStyle(ChatFormatting.GRAY)
.append(Component.literal("").withStyle(ChatFormatting.RESET))
.append(Component.literal(new DecimalFormat("##.#").format(damage) + (heBullet(stack) ? " + " + new DecimalFormat("##.#").format(0.8 * damage * (1 + 0.1 * heBulletLevel(stack))) : "")).withStyle(ChatFormatting.GREEN)));
} else {
double damage = ItemNBTTool.getDouble(stack, "damage", 0) double damage = ItemNBTTool.getDouble(stack, "damage", 0)
* ItemNBTTool.getDouble(stack, "levelDamageMultiple", 1); * ItemNBTTool.getDouble(stack, "levelDamageMultiple", 1) * perkDamage(stack);
tooltip.add(Component.translatable("des.superbwarfare.tips.damage").withStyle(ChatFormatting.GRAY) tooltip.add(Component.translatable("des.superbwarfare.tips.damage").withStyle(ChatFormatting.GRAY)
.append(Component.literal("").withStyle(ChatFormatting.RESET)) .append(Component.literal("").withStyle(ChatFormatting.RESET))
.append(Component.literal(new DecimalFormat("##.#").format(damage) + " * " + new DecimalFormat("##").format(ItemNBTTool.getDouble(stack, "projectile_amount", 0))).withStyle(ChatFormatting.GREEN))); .append(Component.literal(new DecimalFormat("##.#").format(damage) + " * " + new DecimalFormat("##").format(ItemNBTTool.getDouble(stack, "projectile_amount", 0))).withStyle(ChatFormatting.GREEN)));
}
if (stack.is(ModTags.Items.IS_AUTO_WEAPON)) { if (stack.is(ModTags.Items.IS_AUTO_WEAPON)) {
addRpmTips(tooltip, stack); addRpmTips(tooltip, stack);
@ -126,12 +164,30 @@ public class TooltipTool {
if (!ammoTag.isEmpty()) { if (!ammoTag.isEmpty()) {
String id = ammoTag.getString("id").split(":")[1]; String id = ammoTag.getString("id").split(":")[1];
var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO);
tooltip.add(Component.translatable("perk.superbwarfare.slot_Ammo").withStyle(ChatFormatting.YELLOW) tooltip.add(Component.translatable("perk.superbwarfare.slot_Ammo").withStyle(ChatFormatting.YELLOW)
.append(Component.literal(" >> ")) .append(Component.literal(" >> "))
.append(Component.literal("").withStyle(ChatFormatting.RESET)) .append(Component.literal("").withStyle(ChatFormatting.RESET))
.append(Component.translatable("item.superbwarfare." + id).withStyle(ChatFormatting.WHITE)) .append(Component.translatable("item.superbwarfare." + id).withStyle(ChatFormatting.WHITE))
.append(Component.literal(" Lvl. " + ammoTag.getInt("level")).withStyle(ChatFormatting.WHITE))); .append(Component.literal(" Lvl. " + ammoTag.getInt("level")).withStyle(ChatFormatting.WHITE)));
addHideText(tooltip, Component.translatable("des.superbwarfare." + id).withStyle(ChatFormatting.GRAY)); addHideText(tooltip, Component.translatable("des.superbwarfare." + id).withStyle(ChatFormatting.GRAY));
if (perk instanceof AmmoPerk ammoPerk) {
if (ammoPerk.damageRate < 1) {
addHideText(tooltip, Component.translatable("des.superbwarfare.perk_damage_reduce").withStyle(ChatFormatting.RED));
} else if (ammoPerk.damageRate > 1) {
addHideText(tooltip, Component.translatable("des.superbwarfare.perk_damage_plus").withStyle(ChatFormatting.GREEN));
}
if (ammoPerk.speedRate < 1) {
addHideText(tooltip, Component.translatable("des.superbwarfare.perk_speed_reduce").withStyle(ChatFormatting.RED));
} else if (ammoPerk.speedRate > 1) {
addHideText(tooltip, Component.translatable("des.superbwarfare.perk_speed_plus").withStyle(ChatFormatting.GREEN));
}
if (ammoPerk.slug && stack.is(ModTags.Items.SHOTGUN)) {
addHideText(tooltip, Component.translatable("des.superbwarfare.perk_slug").withStyle(ChatFormatting.YELLOW));
}
}
} }
if (!functionalTag.isEmpty()) { if (!functionalTag.isEmpty()) {
@ -157,14 +213,26 @@ public class TooltipTool {
public static void addBocekTips(List<Component> tooltip, ItemStack stack) { public static void addBocekTips(List<Component> tooltip, ItemStack stack) {
tooltip.add(Component.literal("")); tooltip.add(Component.literal(""));
boolean slug = false;
double total = ItemNBTTool.getDouble(stack, "damage", 0) * ItemNBTTool.getDouble(stack, "levelDamageMultiple", 1); var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO);
if (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug) {
slug = true;
}
double total = ItemNBTTool.getDouble(stack, "damage", 0) * ItemNBTTool.getDouble(stack, "levelDamageMultiple", 1) * perkDamage(stack);
if (slug) {
tooltip.add(Component.translatable("des.superbwarfare.tips.damage").withStyle(ChatFormatting.GRAY)
.append(Component.literal("").withStyle(ChatFormatting.RESET))
.append(Component.literal(new DecimalFormat("##.#").format(total) + (heBullet(stack) ? " + " + new DecimalFormat("##.#").format(0.8 * total * (1 + 0.1 * heBulletLevel(stack))) : "")).withStyle(ChatFormatting.GREEN)));
} else {
tooltip.add(Component.translatable("des.superbwarfare.tips.damage").withStyle(ChatFormatting.GRAY) tooltip.add(Component.translatable("des.superbwarfare.tips.damage").withStyle(ChatFormatting.GRAY)
.append(Component.literal("").withStyle(ChatFormatting.RESET)) .append(Component.literal("").withStyle(ChatFormatting.RESET))
.append(Component.literal(new DecimalFormat("##.#").format(total * 0.1) + " * 10").withStyle(ChatFormatting.GREEN)) .append(Component.literal(new DecimalFormat("##.#").format(total * 0.1) + " * 10").withStyle(ChatFormatting.GREEN))
.append(Component.literal(" / ").withStyle(ChatFormatting.RESET)) .append(Component.literal(" / ").withStyle(ChatFormatting.RESET))
.append(Component.literal(new DecimalFormat("##.#").format(total)).withStyle(ChatFormatting.GREEN))); .append(Component.literal(new DecimalFormat("##.#").format(total)).withStyle(ChatFormatting.GREEN)));
}
addLevelTips(tooltip, stack); addLevelTips(tooltip, stack);
addBypassTips(tooltip, stack); addBypassTips(tooltip, stack);
@ -183,17 +251,18 @@ public class TooltipTool {
if (flag.get()) { if (flag.get()) {
double damage = (ItemNBTTool.getDouble(stack, "damage", 0) + double damage = (ItemNBTTool.getDouble(stack, "damage", 0) +
ItemNBTTool.getDouble(stack, "sentinelChargeDamage", 0)) ItemNBTTool.getDouble(stack, "sentinelChargeDamage", 0))
* ItemNBTTool.getDouble(stack, "levelDamageMultiple", 1); * ItemNBTTool.getDouble(stack, "levelDamageMultiple", 1)
* perkDamage(stack);
tooltip.add(Component.translatable("des.superbwarfare.tips.damage").withStyle(ChatFormatting.GRAY) tooltip.add(Component.translatable("des.superbwarfare.tips.damage").withStyle(ChatFormatting.GRAY)
.append(Component.literal("").withStyle(ChatFormatting.RESET)) .append(Component.literal("").withStyle(ChatFormatting.RESET))
.append(Component.literal(new DecimalFormat("##.#").format(damage)).withStyle(ChatFormatting.AQUA).withStyle(ChatFormatting.BOLD))); .append(Component.literal(new DecimalFormat("##.#").format(damage) + (heBullet(stack) ? " + " + new DecimalFormat("##.#").format(0.8 * damage * (1 + 0.1 * heBulletLevel(stack))) : "")).withStyle(ChatFormatting.AQUA).withStyle(ChatFormatting.BOLD)));
} else { } else {
double damage = ItemNBTTool.getDouble(stack, "damage", 0) * ItemNBTTool.getDouble(stack, "levelDamageMultiple", 1); double damage = ItemNBTTool.getDouble(stack, "damage", 0) * ItemNBTTool.getDouble(stack, "levelDamageMultiple", 1) * perkDamage(stack);
tooltip.add(Component.translatable("des.superbwarfare.tips.damage").withStyle(ChatFormatting.GRAY) tooltip.add(Component.translatable("des.superbwarfare.tips.damage").withStyle(ChatFormatting.GRAY)
.append(Component.literal("").withStyle(ChatFormatting.RESET)) .append(Component.literal("").withStyle(ChatFormatting.RESET))
.append(Component.literal(new DecimalFormat("##.#").format(damage)).withStyle(ChatFormatting.GREEN))); .append(Component.literal(new DecimalFormat("##.#").format(damage) + (heBullet(stack) ? new DecimalFormat("##.#").format(0.4 * damage * (1 + 0.1 * heBulletLevel(stack))) : "")).withStyle(ChatFormatting.GREEN)));
} }
if (stack.is(ModTags.Items.IS_AUTO_WEAPON)) { if (stack.is(ModTags.Items.IS_AUTO_WEAPON)) {

View file

@ -386,6 +386,12 @@
"config.superbwarfare.client.display.camera_rotate.des": "手持枪械时,视角会出现轻微的摇晃", "config.superbwarfare.client.display.camera_rotate.des": "手持枪械时,视角会出现轻微的摇晃",
"config.superbwarfare.client.display.armor_plate_hud": "Armor Plate HUD", "config.superbwarfare.client.display.armor_plate_hud": "Armor Plate HUD",
"config.superbwarfare.client.display.armor_plate_hud.des": "开启时,在屏幕左下角显示当前胸甲装备的防弹插板的耐久", "config.superbwarfare.client.display.armor_plate_hud.des": "开启时,在屏幕左下角显示当前胸甲装备的防弹插板的耐久",
"des.superbwarfare.use_tip.ammobox": "潜行左键切换弹药种类,潜行右键取出身上该类型弹药,非潜行右键取出相应种类弹药。" "des.superbwarfare.use_tip.ammobox": "潜行左键切换弹药种类,潜行右键取出身上该类型弹药,非潜行右键取出相应种类弹药。",
"des.superbwarfare.perk_damage_reduce": "Damage -",
"des.superbwarfare.perk_damage_plus": "Damage +",
"des.superbwarfare.perk_speed_reduce": "Velocity -",
"des.superbwarfare.perk_speed_plus": "Velocity +",
"des.superbwarfare.perk_slug": "Slug"
} }

View file

@ -384,5 +384,11 @@
"config.superbwarfare.client.display.camera_rotate": "视角摇晃", "config.superbwarfare.client.display.camera_rotate": "视角摇晃",
"config.superbwarfare.client.display.camera_rotate.des": "手持枪械时,视角会出现轻微的摇晃", "config.superbwarfare.client.display.camera_rotate.des": "手持枪械时,视角会出现轻微的摇晃",
"config.superbwarfare.client.display.armor_plate_hud": "防弹插板信息", "config.superbwarfare.client.display.armor_plate_hud": "防弹插板信息",
"config.superbwarfare.client.display.armor_plate_hud.des": "开启时,在屏幕左下角显示当前胸甲装备的防弹插板的耐久" "config.superbwarfare.client.display.armor_plate_hud.des": "开启时,在屏幕左下角显示当前胸甲装备的防弹插板的耐久",
"des.superbwarfare.perk_damage_reduce": "伤害 -",
"des.superbwarfare.perk_damage_plus": "伤害 +",
"des.superbwarfare.perk_speed_reduce": "子弹初速 -",
"des.superbwarfare.perk_speed_plus": "子弹初速 +",
"des.superbwarfare.perk_slug": "独头弹"
} }