重构武器等级系统

This commit is contained in:
17146 2024-09-30 15:58:01 +08:00
parent 203ed22b8d
commit e361717a00
6 changed files with 82 additions and 56 deletions

View file

@ -200,7 +200,7 @@ public class CannonShellEntity extends ThrowableItemProjectile implements GeoEnt
} }
CustomExplosion explosion = new CustomExplosion(this.level(), this, 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); this.getX(), this.getY(), this.getZ(), explosionRadius, Explosion.BlockInteraction.KEEP).setDamageMultiplier(1).setFireTime(fireTime);
explosion.explode(); explosion.explode();
net.minecraftforge.event.ForgeEventFactory.onExplosionStart(this.level(), explosion); net.minecraftforge.event.ForgeEventFactory.onExplosionStart(this.level(), explosion);

View file

@ -34,8 +34,11 @@ import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.network.PacketDistributor; import net.minecraftforge.network.PacketDistributor;
import java.text.DecimalFormat;
@Mod.EventBusSubscriber @Mod.EventBusSubscriber
public class LivingEventHandler { public class LivingEventHandler {
@SubscribeEvent @SubscribeEvent
public static void onEntityHurt(LivingHurtEvent event) { public static void onEntityHurt(LivingHurtEvent event) {
if (event == null || event.getEntity() == null) { if (event == null || event.getEntity() == null) {
@ -44,7 +47,9 @@ public class LivingEventHandler {
handleGunPerksWhenHurt(event); handleGunPerksWhenHurt(event);
renderDamageIndicator(event); renderDamageIndicator(event);
reduceBulletDamage(event, event.getSource(), event.getEntity(), event.getSource().getEntity(), event.getAmount()); reduceBulletDamage(event);
giveExpToWeapon(event);
handleGunLevels(event);
} }
@SubscribeEvent @SubscribeEvent
@ -58,21 +63,24 @@ public class LivingEventHandler {
handlePlayerKillEntity(event); 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; 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)) { if (DamageTypeTool.isGunDamage(source)) {
stack.getOrCreateTag().putDouble("damagetotal", stack.getOrCreateTag().getDouble("damagetotal") + damage); double distance = entity.position().distanceTo(sourceEntity.position());
}
if (DamageTypeTool.isGunDamage(damageSource)) {
double distance = entity.position().distanceTo(sourceentity.position());
if (stack.is(ModTags.Items.USE_SHOTGUN_AMMO)) { if (stack.is(ModTags.Items.USE_SHOTGUN_AMMO)) {
damage = reduceDamageByDistance(amount, distance, 0.03, 25); damage = reduceDamageByDistance(amount, distance, 0.03, 25);
@ -87,20 +95,19 @@ public class LivingEventHandler {
} }
} }
if (damageSource.is(ModTags.DamageTypes.PROJECTILE)) { if (source.is(ModTags.DamageTypes.PROJECTILE)) {
damage = damage * (1 - Mth.clamp(entity.getAttributeValue(ModAttributes.BULLET_RESISTANCE.get()), 0, 1)); damage *= 1 - Mth.clamp(entity.getAttributeValue(ModAttributes.BULLET_RESISTANCE.get()), 0, 1);
} }
if (damageSource.is(ModTags.DamageTypes.PROJECTILE_ABSOLUTE)) { if (source.is(ModTags.DamageTypes.PROJECTILE_ABSOLUTE)) {
damage = damage * (1 - 0.2 * Mth.clamp(entity.getAttributeValue(ModAttributes.BULLET_RESISTANCE.get()), 0, 1)); damage *= 1 - 0.2 * Mth.clamp(entity.getAttributeValue(ModAttributes.BULLET_RESISTANCE.get()), 0, 1);
} }
event.setAmount((float) damage); 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 DecimalFormat("##.#").format(damage) +
if (entity instanceof TargetEntity && sourceentity instanceof Player player) { " Distance:" + new DecimalFormat("##.#").format(entity.position().distanceTo(sourceEntity.position())) + "M"), false);
player.displayClientMessage(Component.literal("Damage:" + new java.text.DecimalFormat("##.#").format(damage) + " Distance:" + new java.text.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)); 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) { private static void killIndication(DamageSource source) {
var sourceEntity = source.getEntity(); var sourceEntity = source.getEntity();
if (sourceEntity == null) { if (sourceEntity == null) {
@ -318,7 +371,7 @@ public class LivingEventHandler {
} }
} }
if (DamageTypeTool.isGunHeadshotDamage(source)) { if (DamageTypeTool.isHeadshotDamage(source)) {
handleHeadSeekerDamage(stack, event); handleHeadSeekerDamage(stack, event);
} }
} }

View file

@ -89,7 +89,6 @@ public class PlayerEventHandler {
if (stack.is(ModTags.Items.GUN)) { if (stack.is(ModTags.Items.GUN)) {
handleWeaponSway(player); handleWeaponSway(player);
handlePlayerSprint(player); handlePlayerSprint(player);
handleWeaponLevel(player);
handleAmmoCount(player); handleAmmoCount(player);
handleSpecialWeaponAmmo(player); handleSpecialWeaponAmmo(player);
handleChangeFireRate(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) { public static void handleAmmoCount(Player player) {
ItemStack stack = player.getMainHandItem(); ItemStack stack = player.getMainHandItem();

View file

@ -17,10 +17,6 @@ public class DamageTypeTool {
|| damageType == ModDamageTypes.GUN_FIRE_ABSOLUTE || damageType == ModDamageTypes.GUN_FIRE_HEADSHOT_ABSOLUTE; || 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) { public static boolean isHeadshotDamage(DamageSource source) {
return source.is(ModDamageTypes.GUN_FIRE_HEADSHOT) || source.is(ModDamageTypes.GUN_FIRE_HEADSHOT_ABSOLUTE); return source.is(ModDamageTypes.GUN_FIRE_HEADSHOT) || source.is(ModDamageTypes.GUN_FIRE_HEADSHOT_ABSOLUTE);
} }

View file

@ -66,8 +66,8 @@ public class GunsTool {
public static void pvpModeCheck(ItemStack stack, Level level) { public static void pvpModeCheck(ItemStack stack, Level level) {
if (!ModVariables.MapVariables.get(level).pvpMode) { if (!ModVariables.MapVariables.get(level).pvpMode) {
if (stack.getOrCreateTag().getInt("level") >= 10) { if (stack.getOrCreateTag().getInt("Level") >= 10) {
stack.getOrCreateTag().putDouble("levelDamageMultiple", 1 + 0.05 * (stack.getOrCreateTag().getInt("level") - 10)); stack.getOrCreateTag().putDouble("levelDamageMultiple", 1 + 0.05 * (stack.getOrCreateTag().getInt("Level") - 10));
} else { } else {
stack.getOrCreateTag().putDouble("levelDamageMultiple", 1); stack.getOrCreateTag().putDouble("levelDamageMultiple", 1);
} }

View file

@ -71,8 +71,8 @@ public class TooltipTool {
} }
private static void addLevelTips(List<Component> tooltip, ItemStack stack) { private static void addLevelTips(List<Component> tooltip, ItemStack stack) {
int level = (int) ItemNBTTool.getDouble(stack, "level", 0); int level = ItemNBTTool.getInt(stack, "Level", 0);
double rate = ItemNBTTool.getDouble(stack, "damagenow", 0) / ItemNBTTool.getDouble(stack, "damageneed", 1); 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; ChatFormatting formatting;
if (level < 10) { if (level < 10) {
@ -130,7 +130,7 @@ public class TooltipTool {
.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));
} }
@ -140,7 +140,7 @@ public class TooltipTool {
.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. " + 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)); addHideText(tooltip, Component.translatable("des.superbwarfare." + id).withStyle(ChatFormatting.GRAY));
} }
@ -150,7 +150,7 @@ public class TooltipTool {
.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. " + 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)); addHideText(tooltip, Component.translatable("des.superbwarfare." + id).withStyle(ChatFormatting.GRAY));
} }
} }