重构武器等级系统
This commit is contained in:
parent
203ed22b8d
commit
e361717a00
6 changed files with 82 additions and 56 deletions
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -71,8 +71,8 @@ public class TooltipTool {
|
|||
}
|
||||
|
||||
private static void addLevelTips(List<Component> 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));
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue