重构武器等级系统
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,
|
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);
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue