diff --git a/src/main/java/net/mcreator/superbwarfare/entity/projectile/CannonShellEntity.java b/src/main/java/net/mcreator/superbwarfare/entity/projectile/CannonShellEntity.java index e1bb190ff..a360f8a36 100644 --- a/src/main/java/net/mcreator/superbwarfare/entity/projectile/CannonShellEntity.java +++ b/src/main/java/net/mcreator/superbwarfare/entity/projectile/CannonShellEntity.java @@ -200,7 +200,7 @@ public class CannonShellEntity extends ThrowableItemProjectile implements GeoEnt } CustomExplosion explosion = new CustomExplosion(this.level(), this, - ModDamageTypes.causeProjectileBoomDamage(this.level().registryAccess(), this, this.getOwner()), explosionDamage, + ModDamageTypes.causeCannonFireDamage(this.level().registryAccess(), this, this.getOwner()), explosionDamage, this.getX(), this.getY(), this.getZ(), explosionRadius, Explosion.BlockInteraction.KEEP).setDamageMultiplier(1).setFireTime(fireTime); explosion.explode(); net.minecraftforge.event.ForgeEventFactory.onExplosionStart(this.level(), explosion); diff --git a/src/main/java/net/mcreator/superbwarfare/event/LivingEventHandler.java b/src/main/java/net/mcreator/superbwarfare/event/LivingEventHandler.java index ba234e80f..01fac00df 100644 --- a/src/main/java/net/mcreator/superbwarfare/event/LivingEventHandler.java +++ b/src/main/java/net/mcreator/superbwarfare/event/LivingEventHandler.java @@ -34,8 +34,11 @@ import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.network.PacketDistributor; +import java.text.DecimalFormat; + @Mod.EventBusSubscriber public class LivingEventHandler { + @SubscribeEvent public static void onEntityHurt(LivingHurtEvent event) { if (event == null || event.getEntity() == null) { @@ -44,7 +47,9 @@ public class LivingEventHandler { handleGunPerksWhenHurt(event); renderDamageIndicator(event); - reduceBulletDamage(event, event.getSource(), event.getEntity(), event.getSource().getEntity(), event.getAmount()); + reduceBulletDamage(event); + giveExpToWeapon(event); + handleGunLevels(event); } @SubscribeEvent @@ -58,21 +63,24 @@ public class LivingEventHandler { handlePlayerKillEntity(event); } - private static void reduceBulletDamage(LivingHurtEvent event, DamageSource damageSource, LivingEntity entity, Entity sourceentity, double amount) { - if (damageSource == null || entity == null || sourceentity == null) { - return; - } + /** + * 计算子弹伤害衰减 + */ + private static void reduceBulletDamage(LivingHurtEvent event) { + DamageSource source = event.getSource(); + if (source == null) return; + LivingEntity entity = event.getEntity(); + if (entity == null) return; + Entity sourceEntity = source.getEntity(); + if (sourceEntity == null) return; + double amount = event.getAmount(); double damage = amount; - ItemStack stack = sourceentity instanceof LivingEntity living ? living.getMainHandItem() : ItemStack.EMPTY; + ItemStack stack = sourceEntity instanceof LivingEntity living ? living.getMainHandItem() : ItemStack.EMPTY; - if ((damageSource.is(ModDamageTypes.PROJECTILE_BOOM) || damageSource.is(ModDamageTypes.CANNON_FIRE)) && stack.is(ModTags.Items.LAUNCHER)) { - stack.getOrCreateTag().putDouble("damagetotal", stack.getOrCreateTag().getDouble("damagetotal") + damage); - } - - if (DamageTypeTool.isGunDamage(damageSource)) { - double distance = entity.position().distanceTo(sourceentity.position()); + if (DamageTypeTool.isGunDamage(source)) { + double distance = entity.position().distanceTo(sourceEntity.position()); if (stack.is(ModTags.Items.USE_SHOTGUN_AMMO)) { damage = reduceDamageByDistance(amount, distance, 0.03, 25); @@ -87,20 +95,19 @@ public class LivingEventHandler { } } - if (damageSource.is(ModTags.DamageTypes.PROJECTILE)) { - damage = damage * (1 - Mth.clamp(entity.getAttributeValue(ModAttributes.BULLET_RESISTANCE.get()), 0, 1)); + if (source.is(ModTags.DamageTypes.PROJECTILE)) { + damage *= 1 - Mth.clamp(entity.getAttributeValue(ModAttributes.BULLET_RESISTANCE.get()), 0, 1); } - if (damageSource.is(ModTags.DamageTypes.PROJECTILE_ABSOLUTE)) { - damage = damage * (1 - 0.2 * Mth.clamp(entity.getAttributeValue(ModAttributes.BULLET_RESISTANCE.get()), 0, 1)); + if (source.is(ModTags.DamageTypes.PROJECTILE_ABSOLUTE)) { + damage *= 1 - 0.2 * Mth.clamp(entity.getAttributeValue(ModAttributes.BULLET_RESISTANCE.get()), 0, 1); } event.setAmount((float) damage); - stack.getOrCreateTag().putDouble("damagetotal", stack.getOrCreateTag().getDouble("damagetotal") + damage); - - if (entity instanceof TargetEntity && sourceentity instanceof Player player) { - player.displayClientMessage(Component.literal("Damage:" + new java.text.DecimalFormat("##.#").format(damage) + " Distance:" + new java.text.DecimalFormat("##.#").format((entity.position()).distanceTo((sourceentity.position()))) + "M"), false); + if (entity instanceof TargetEntity && sourceEntity instanceof Player player) { + player.displayClientMessage(Component.literal("Damage:" + new DecimalFormat("##.#").format(damage) + + " Distance:" + new DecimalFormat("##.#").format(entity.position().distanceTo(sourceEntity.position())) + "M"), false); } } @@ -108,6 +115,52 @@ public class LivingEventHandler { return amount / (1 + rate * Math.max(0, distance - minDistance)); } + /** + * 根据造成的伤害,提供武器经验 + */ + private static void giveExpToWeapon(LivingHurtEvent event) { + DamageSource source = event.getSource(); + if (source == null) return; + Entity sourceEntity = source.getEntity(); + if (!(sourceEntity instanceof Player player)) return; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return; + + double amount = event.getAmount(); + + // 先处理发射器类武器或高爆弹的爆炸伤害 + if (source.is(ModDamageTypes.PROJECTILE_BOOM)) { + if (stack.is(ModTags.Items.LAUNCHER) || PerkHelper.getItemPerkLevel(ModPerks.HE_BULLET.get(), stack) > 0) { + stack.getOrCreateTag().putDouble("Exp", stack.getOrCreateTag().getDouble("Exp") + amount); + } + } + + // 再判断是不是枪械能造成的伤害 + if (!DamageTypeTool.isGunDamage(source)) return; + + stack.getOrCreateTag().putDouble("Exp", stack.getOrCreateTag().getDouble("Exp") + amount); + } + + private static void handleGunLevels(LivingHurtEvent event) { + DamageSource source = event.getSource(); + if (source == null) return; + Entity sourceEntity = source.getEntity(); + if (!(sourceEntity instanceof Player player)) return; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return; + + var tag = stack.getOrCreateTag(); + int level = stack.getOrCreateTag().getInt("Level"); + double exp = stack.getOrCreateTag().getDouble("Exp"); + double upgradeExpNeeded = 20 / 3.0 * Math.pow(level, 3) + 90 * Math.pow(level, 2) - 290 / 3.0 * level + 20; + + if (exp >= upgradeExpNeeded) { + tag.putDouble("Exp", exp - upgradeExpNeeded); + tag.putInt("Level", level + 1); + tag.putDouble("UpgradePoint", tag.getDouble("UpgradePoint") + 0.25); + } + } + private static void killIndication(DamageSource source) { var sourceEntity = source.getEntity(); if (sourceEntity == null) { @@ -318,7 +371,7 @@ public class LivingEventHandler { } } - if (DamageTypeTool.isGunHeadshotDamage(source)) { + if (DamageTypeTool.isHeadshotDamage(source)) { handleHeadSeekerDamage(stack, event); } } diff --git a/src/main/java/net/mcreator/superbwarfare/event/PlayerEventHandler.java b/src/main/java/net/mcreator/superbwarfare/event/PlayerEventHandler.java index 174b15226..e2aee5f95 100644 --- a/src/main/java/net/mcreator/superbwarfare/event/PlayerEventHandler.java +++ b/src/main/java/net/mcreator/superbwarfare/event/PlayerEventHandler.java @@ -89,7 +89,6 @@ public class PlayerEventHandler { if (stack.is(ModTags.Items.GUN)) { handleWeaponSway(player); handlePlayerSprint(player); - handleWeaponLevel(player); handleAmmoCount(player); handleSpecialWeaponAmmo(player); handleChangeFireRate(player); @@ -278,28 +277,6 @@ public class PlayerEventHandler { } } - /** - * 处理武器等级 - */ - private static void handleWeaponLevel(Player player) { - ItemStack stack = player.getMainHandItem(); - if (stack.is(ModTags.Items.GUN)) { - var tag = stack.getOrCreateTag(); - if (tag.getInt("level") == 0) { - tag.putDouble("exp2", 20); - } else { - tag.putDouble("exp2", (tag.getDouble("exp1") + tag.getInt("level") * 200 * (1 + 0.1 * tag.getInt("level")))); - } - if (tag.getDouble("damagetotal") >= tag.getDouble("exp2")) { - tag.putDouble("exp1", (tag.getDouble("exp2"))); - tag.putInt("level", tag.getInt("level") + 1); - tag.putDouble("UpgradePoint", tag.getDouble("UpgradePoint") + 0.25); - } - tag.putDouble("damagenow", (tag.getDouble("damagetotal") - tag.getDouble("exp1"))); - tag.putDouble("damageneed", (tag.getDouble("exp2") - tag.getDouble("exp1"))); - } - } - public static void handleAmmoCount(Player player) { ItemStack stack = player.getMainHandItem(); diff --git a/src/main/java/net/mcreator/superbwarfare/tools/DamageTypeTool.java b/src/main/java/net/mcreator/superbwarfare/tools/DamageTypeTool.java index 63e10b71a..c92e21ba8 100644 --- a/src/main/java/net/mcreator/superbwarfare/tools/DamageTypeTool.java +++ b/src/main/java/net/mcreator/superbwarfare/tools/DamageTypeTool.java @@ -17,10 +17,6 @@ public class DamageTypeTool { || damageType == ModDamageTypes.GUN_FIRE_ABSOLUTE || damageType == ModDamageTypes.GUN_FIRE_HEADSHOT_ABSOLUTE; } - public static boolean isGunHeadshotDamage(DamageSource source) { - return source.is(ModDamageTypes.GUN_FIRE_HEADSHOT) || source.is(ModDamageTypes.GUN_FIRE_HEADSHOT_ABSOLUTE); - } - public static boolean isHeadshotDamage(DamageSource source) { return source.is(ModDamageTypes.GUN_FIRE_HEADSHOT) || source.is(ModDamageTypes.GUN_FIRE_HEADSHOT_ABSOLUTE); } diff --git a/src/main/java/net/mcreator/superbwarfare/tools/GunsTool.java b/src/main/java/net/mcreator/superbwarfare/tools/GunsTool.java index b430ca855..002cc6915 100644 --- a/src/main/java/net/mcreator/superbwarfare/tools/GunsTool.java +++ b/src/main/java/net/mcreator/superbwarfare/tools/GunsTool.java @@ -66,8 +66,8 @@ public class GunsTool { public static void pvpModeCheck(ItemStack stack, Level level) { if (!ModVariables.MapVariables.get(level).pvpMode) { - if (stack.getOrCreateTag().getInt("level") >= 10) { - stack.getOrCreateTag().putDouble("levelDamageMultiple", 1 + 0.05 * (stack.getOrCreateTag().getInt("level") - 10)); + if (stack.getOrCreateTag().getInt("Level") >= 10) { + stack.getOrCreateTag().putDouble("levelDamageMultiple", 1 + 0.05 * (stack.getOrCreateTag().getInt("Level") - 10)); } else { stack.getOrCreateTag().putDouble("levelDamageMultiple", 1); } diff --git a/src/main/java/net/mcreator/superbwarfare/tools/TooltipTool.java b/src/main/java/net/mcreator/superbwarfare/tools/TooltipTool.java index d0dbe046c..5fc6c9d3d 100644 --- a/src/main/java/net/mcreator/superbwarfare/tools/TooltipTool.java +++ b/src/main/java/net/mcreator/superbwarfare/tools/TooltipTool.java @@ -71,8 +71,8 @@ public class TooltipTool { } private static void addLevelTips(List tooltip, ItemStack stack) { - int level = (int) ItemNBTTool.getDouble(stack, "level", 0); - double rate = ItemNBTTool.getDouble(stack, "damagenow", 0) / ItemNBTTool.getDouble(stack, "damageneed", 1); + int level = ItemNBTTool.getInt(stack, "Level", 0); + double rate = ItemNBTTool.getDouble(stack, "Exp", 0) / (20 / 3.0 * Math.pow(level, 3) + 90 * Math.pow(level, 2) - 290 / 3.0 * level + 20); ChatFormatting formatting; if (level < 10) { @@ -130,7 +130,7 @@ public class TooltipTool { .append(Component.literal(" >> ")) .append(Component.literal("").withStyle(ChatFormatting.RESET)) .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)); } @@ -140,7 +140,7 @@ public class TooltipTool { .append(Component.literal(" >> ")) .append(Component.literal("").withStyle(ChatFormatting.RESET)) .append(Component.translatable("item.superbwarfare." + id).withStyle(ChatFormatting.WHITE)) - .append(Component.literal(" Lvl. " + functionalTag.getInt("level")).withStyle(ChatFormatting.WHITE))); + .append(Component.literal(" Lvl. " + functionalTag.getInt("Level")).withStyle(ChatFormatting.WHITE))); addHideText(tooltip, Component.translatable("des.superbwarfare." + id).withStyle(ChatFormatting.GRAY)); } @@ -150,7 +150,7 @@ public class TooltipTool { .append(Component.literal(" >> ")) .append(Component.literal("").withStyle(ChatFormatting.RESET)) .append(Component.translatable("item.superbwarfare." + id).withStyle(ChatFormatting.WHITE)) - .append(Component.literal(" Lvl. " + damageTag.getInt("level")).withStyle(ChatFormatting.WHITE))); + .append(Component.literal(" Lvl. " + damageTag.getInt("Level")).withStyle(ChatFormatting.WHITE))); addHideText(tooltip, Component.translatable("des.superbwarfare." + id).withStyle(ChatFormatting.GRAY)); } }