From 3f2742efbea42f4c0a199da56fe70598397464a2 Mon Sep 17 00:00:00 2001 From: 17146 <1714673995@qq.com> Date: Sat, 3 Aug 2024 23:22:51 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=B7=B7=E4=BC=A4=E7=9A=84?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/screens/KillMessageOverlay.java | 6 +-- .../entity/ProjectileEntity.java | 43 +++++++++++++------ .../superbwarfare/event/GunEventHandler.java | 4 +- .../event/LivingEventHandler.java | 35 +++++++-------- .../event/PlayerEventHandler.java | 2 +- .../network/message/FireMessage.java | 4 +- .../superbwarfare/tools/DamageTypeTool.java | 43 +++++++++++++++++++ 7 files changed, 97 insertions(+), 40 deletions(-) create mode 100644 src/main/java/net/mcreator/superbwarfare/tools/DamageTypeTool.java diff --git a/src/main/java/net/mcreator/superbwarfare/client/screens/KillMessageOverlay.java b/src/main/java/net/mcreator/superbwarfare/client/screens/KillMessageOverlay.java index 968c77e9e..536b54133 100644 --- a/src/main/java/net/mcreator/superbwarfare/client/screens/KillMessageOverlay.java +++ b/src/main/java/net/mcreator/superbwarfare/client/screens/KillMessageOverlay.java @@ -7,6 +7,7 @@ import net.mcreator.superbwarfare.event.KillMessageHandler; import net.mcreator.superbwarfare.init.ModDamageTypes; import net.mcreator.superbwarfare.init.ModItems; import net.mcreator.superbwarfare.item.gun.GunItem; +import net.mcreator.superbwarfare.tools.DamageTypeTool; import net.mcreator.superbwarfare.tools.PlayerKillRecord; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; @@ -112,8 +113,6 @@ public class KillMessageOverlay { GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ONE ); - // TODO 实现图标半透明渲染 - // 入场效果 if (record.tick < 3) { gui.pose().translate((3 - record.tick - event.getPartialTick()) * 33, 0, 0); @@ -247,8 +246,7 @@ public class KillMessageOverlay { if (record.headshot) { icon = HEADSHOT; } else { - if (record.damageType == ModDamageTypes.GUN_FIRE || record.damageType == ModDamageTypes.GUN_FIRE_HEADSHOT - || record.damageType == ModDamageTypes.ARROW_IN_KNEE || record.damageType == ModDamageTypes.ARROW_IN_BRAIN) { + if (DamageTypeTool.isArrowDamage(record.damageType) || DamageTypeTool.isGunDamage(record.damageType)) { icon = null; } else { // 如果是其他伤害,则渲染对应图标 diff --git a/src/main/java/net/mcreator/superbwarfare/entity/ProjectileEntity.java b/src/main/java/net/mcreator/superbwarfare/entity/ProjectileEntity.java index 2eb31eecd..99cc8f3f4 100644 --- a/src/main/java/net/mcreator/superbwarfare/entity/ProjectileEntity.java +++ b/src/main/java/net/mcreator/superbwarfare/entity/ProjectileEntity.java @@ -76,10 +76,11 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa protected int shooterId; private float damage = 1f; private float headShot = 1f; - private int monster_multiple = 0; + private int monsterMultiple = 0; private float legShot = 0.5f; private boolean beast = false; private boolean zoom = false; + private float bypassArmorRate = 0.0f; public ProjectileEntity(EntityType p_i50159_1_, Level p_i50159_2_) { super(p_i50159_1_, p_i50159_2_); @@ -109,7 +110,7 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa } public ProjectileEntity monsterMultiple(int monsterMultiple) { - this.monster_multiple = monsterMultiple; + this.monsterMultiple = monsterMultiple; return this; } @@ -128,6 +129,11 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa return this; } + public ProjectileEntity bypassArmorRate(float bypassArmorRate) { + this.bypassArmorRate = bypassArmorRate; + return this; + } + @Nullable protected EntityResult findEntityOnPath(Vec3 startVec, Vec3 endVec) { Vec3 hitVec = null; @@ -352,8 +358,8 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa } } - protected void onHitEntity(Entity entity, boolean headshot, boolean legshot) { - float m_multiple = 1 + 0.2f * this.monster_multiple; + protected void onHitEntity(Entity entity, boolean headshot, boolean legShot) { + float mMultiple = 1 + 0.2f * this.monsterMultiple; if (entity == null) return; @@ -401,11 +407,11 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa ModUtils.PACKET_HANDLER.send(PacketDistributor.PLAYER.with(() -> player), new ClientIndicatorMessage(1, 5)); } if (entity instanceof Monster monster) { - monster.hurt(ModDamageTypes.causeGunFireHeadshotDamage(this.level().registryAccess(), this, this.shooter), this.damage * this.headShot * m_multiple); + performDamage(monster, this.damage * mMultiple, true); } else { - entity.hurt(ModDamageTypes.causeGunFireHeadshotDamage(this.level().registryAccess(), this, this.shooter), this.damage * this.headShot); + performDamage(entity, this.damage, true); } - } else if (legshot) { + } else if (legShot) { if (!this.shooter.level().isClientSide() && this.shooter instanceof ServerPlayer player) { var holder = Holder.direct(ModSounds.INDICATION.get()); player.connection.send(new ClientboundSoundPacket(holder, SoundSource.PLAYERS, player.getX(), player.getY(), player.getZ(), 1f, 1f, player.level().random.nextLong())); @@ -414,9 +420,9 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa } if (entity instanceof Monster monster) { - monster.hurt(ModDamageTypes.causeGunFireDamage(this.level().registryAccess(), this, this.shooter), this.damage * this.legShot * m_multiple); + performDamage(monster, this.damage * mMultiple * this.legShot, false); } else { - entity.hurt(ModDamageTypes.causeGunFireDamage(this.level().registryAccess(), this, this.shooter), this.damage * this.legShot); + performDamage(entity, this.damage * this.legShot, false); } if (entity instanceof LivingEntity living) { @@ -436,9 +442,9 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa } if (entity instanceof Monster monster) { - monster.hurt(ModDamageTypes.causeGunFireDamage(this.level().registryAccess(), this, this.shooter), this.damage * m_multiple); + performDamage(monster, this.damage * mMultiple, false); } else { - entity.hurt(ModDamageTypes.causeGunFireDamage(this.level().registryAccess(), this, this.shooter), this.damage); + performDamage(entity, this.damage, false); } } this.discard(); @@ -560,14 +566,25 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa this.xRotO = this.getXRot(); } + private void performDamage(Entity entity, float damage, boolean headshot) { + float normalDamage = damage * Mth.clamp(1 - bypassArmorRate, 0, 1); + float absoluteDamage = damage * Mth.clamp(bypassArmorRate, 0, 1); + + if (headshot) { + entity.hurt(ModDamageTypes.causeGunFireHeadshotDamage(this.level().registryAccess(), this, this.shooter), normalDamage * this.headShot); + entity.hurt(ModDamageTypes.causeGunFireHeadshotAbsoluteDamage(this.level().registryAccess(), this, this.shooter), absoluteDamage * this.headShot); + } else { + entity.hurt(ModDamageTypes.causeGunFireDamage(this.level().registryAccess(), this, this.shooter), normalDamage); + entity.hurt(ModDamageTypes.causeGunFireAbsoluteDamage(this.level().registryAccess(), this, this.shooter), absoluteDamage); + } + } + @Override public void writeSpawnData(FriendlyByteBuf buffer) { - } @Override public void readSpawnData(FriendlyByteBuf additionalData) { - } public static class EntityResult { diff --git a/src/main/java/net/mcreator/superbwarfare/event/GunEventHandler.java b/src/main/java/net/mcreator/superbwarfare/event/GunEventHandler.java index f22e74f60..b19e5dc63 100644 --- a/src/main/java/net/mcreator/superbwarfare/event/GunEventHandler.java +++ b/src/main/java/net/mcreator/superbwarfare/event/GunEventHandler.java @@ -345,6 +345,7 @@ public class GunEventHandler { float headshot = (float) heldItem.getOrCreateTag().getDouble("headshot"); int monsterMultiple = EnchantmentHelper.getTagEnchantmentLevel(ModEnchantments.MONSTER_HUNTER.get(), heldItem); float damage = (float) (heldItem.getOrCreateTag().getDouble("damage") + heldItem.getOrCreateTag().getDouble("add_damage")) * (float) heldItem.getOrCreateTag().getDouble("damageadd"); + float bypassArmorRate = (float) heldItem.getOrCreateTag().getDouble("BypassesArmor"); boolean zoom = player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables()).zoom; @@ -352,7 +353,8 @@ public class GunEventHandler { .shooter(player) .damage(damage) .headShot(headshot) - .zoom(zoom); + .zoom(zoom) + .bypassArmorRate(bypassArmorRate); if (heldItem.getOrCreateTag().getBoolean("beast")) { projectile.beast(); diff --git a/src/main/java/net/mcreator/superbwarfare/event/LivingEventHandler.java b/src/main/java/net/mcreator/superbwarfare/event/LivingEventHandler.java index 8e0076c34..5c3243494 100644 --- a/src/main/java/net/mcreator/superbwarfare/event/LivingEventHandler.java +++ b/src/main/java/net/mcreator/superbwarfare/event/LivingEventHandler.java @@ -8,6 +8,7 @@ import net.mcreator.superbwarfare.item.gun.GunItem; import net.mcreator.superbwarfare.network.ModVariables; import net.mcreator.superbwarfare.network.message.ClientIndicatorMessage; import net.mcreator.superbwarfare.network.message.PlayerGunKillMessage; +import net.mcreator.superbwarfare.tools.DamageTypeTool; import net.mcreator.superbwarfare.tools.SoundTool; import net.minecraft.network.chat.Component; import net.minecraft.network.protocol.game.ClientboundStopSoundPacket; @@ -55,25 +56,23 @@ 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) { + private static void reduceBulletDamage(LivingHurtEvent event, DamageSource damageSource, LivingEntity entity, Entity sourceentity, double amount) { + if (damageSource == null || entity == null || sourceentity == null) { return; } double damage = amount; ItemStack stack = sourceentity instanceof LivingEntity living ? living.getMainHandItem() : ItemStack.EMPTY; - if ((damagesource.is(ModDamageTypes.ARROW_IN_KNEE) || damagesource.is(ModDamageTypes.ARROW_IN_BRAIN) - && stack.getItem() == ModItems.BOCEK.get())) { + if (DamageTypeTool.isArrowDamage(damageSource) && stack.getItem() == ModItems.BOCEK.get()) { stack.getOrCreateTag().putDouble("damagetotal", stack.getOrCreateTag().getDouble("damagetotal") + damage); } - if ((damagesource.is(ModDamageTypes.PROJECTILE_BOOM) || damagesource.is(DamageTypes.ARROW)) - && (stack.getItem() == ModItems.M_79.get() || stack.getItem() == ModItems.RPG.get()) - ) { + if ((damageSource.is(ModDamageTypes.PROJECTILE_BOOM) || damageSource.is(DamageTypes.ARROW)) + && (stack.getItem() == ModItems.M_79.get() || stack.getItem() == ModItems.RPG.get())) { stack.getOrCreateTag().putDouble("damagetotal", stack.getOrCreateTag().getDouble("damagetotal") + damage); } - if (damagesource.is(ModDamageTypes.GUN_FIRE) || damagesource.is(ModDamageTypes.GUN_FIRE_HEADSHOT)) { + if (DamageTypeTool.isGunDamage(damageSource)) { double distance = entity.position().distanceTo(sourceentity.position()); if (stack.is(ModTags.Items.SHOTGUN) || stack.getItem() == ModItems.BOCEK.get()) { @@ -247,7 +246,7 @@ public class LivingEventHandler { } if (attacker != null) { - if (source.is(ModDamageTypes.GUN_FIRE_HEADSHOT) || source.is(ModDamageTypes.ARROW_IN_BRAIN)) { + if (DamageTypeTool.isHeadshotDamage(source)) { ModUtils.PACKET_HANDLER.send(PacketDistributor.ALL.noArg(), new PlayerGunKillMessage(attacker.getId(), entity.getId(), true, damageTypeResourceKey)); } else { ModUtils.PACKET_HANDLER.send(PacketDistributor.ALL.noArg(), new PlayerGunKillMessage(attacker.getId(), entity.getId(), false, damageTypeResourceKey)); @@ -275,21 +274,19 @@ public class LivingEventHandler { return; } - if (source.is(ModDamageTypes.GUN_FIRE) || source.is(ModDamageTypes.GUN_FIRE_HEADSHOT) || - source.is(ModDamageTypes.ARROW_IN_BRAIN) || source.is(ModDamageTypes.ARROW_IN_KNEE) - || source.is(ModDamageTypes.PROJECTILE_BOOM)) { + if (DamageTypeTool.isGunDamage(source) || source.is(ModDamageTypes.PROJECTILE_BOOM)) { handleKillClipDamage(stack, event); } - if (source.is(ModDamageTypes.GUN_FIRE) && source.getDirectEntity() instanceof ProjectileEntity projectile && projectile.isZoom()) { + if (DamageTypeTool.isGunFireDamage(source) && source.getDirectEntity() instanceof ProjectileEntity projectile && projectile.isZoom()) { handleGutshotStraightDamage(stack, event); } - if (source.is(ModDamageTypes.GUN_FIRE) || source.is(ModDamageTypes.GUN_FIRE_HEADSHOT)) { + if (DamageTypeTool.isGunDamage(source)) { handleKillingTallyDamage(stack, event); } - if (source.is(ModDamageTypes.GUN_FIRE_HEADSHOT)) { + if (DamageTypeTool.isGunHeadshotDamage(source)) { handleFourthTimesCharm(stack); } } @@ -314,13 +311,11 @@ public class LivingEventHandler { return; } - if (source.is(ModDamageTypes.GUN_FIRE) || source.is(ModDamageTypes.GUN_FIRE_HEADSHOT) || - source.is(ModDamageTypes.ARROW_IN_BRAIN) || source.is(ModDamageTypes.ARROW_IN_KNEE) - || source.is(ModDamageTypes.PROJECTILE_BOOM)) { + if (DamageTypeTool.isGunDamage(source) || source.is(ModDamageTypes.PROJECTILE_BOOM)) { handleClipEnchantments(stack); } - if (source.is(ModDamageTypes.GUN_FIRE) || source.is(ModDamageTypes.GUN_FIRE_HEADSHOT)) { + if (DamageTypeTool.isGunDamage(source)) { handleKillingTallyAddCount(stack); } } @@ -339,7 +334,7 @@ public class LivingEventHandler { private static void handleKillClipDamage(ItemStack stack, LivingHurtEvent event) { if (stack.getOrCreateTag().getInt("KillClipTime") > 0) { - int enchantmentLevel = EnchantmentHelper.getTagEnchantmentLevel(ModEnchantments.GUTSHOT_STRAIGHT.get(), stack); + int enchantmentLevel = EnchantmentHelper.getTagEnchantmentLevel(ModEnchantments.KILL_CLIP.get(), stack); if (enchantmentLevel == 0) { return; } diff --git a/src/main/java/net/mcreator/superbwarfare/event/PlayerEventHandler.java b/src/main/java/net/mcreator/superbwarfare/event/PlayerEventHandler.java index 4cf0759c9..a88c828d5 100644 --- a/src/main/java/net/mcreator/superbwarfare/event/PlayerEventHandler.java +++ b/src/main/java/net/mcreator/superbwarfare/event/PlayerEventHandler.java @@ -491,7 +491,7 @@ public class PlayerEventHandler { try { Thread.sleep(sleepTime); } catch (InterruptedException e) { - e.printStackTrace(); + ModUtils.LOGGER.error(e.getLocalizedMessage()); } } }; diff --git a/src/main/java/net/mcreator/superbwarfare/network/message/FireMessage.java b/src/main/java/net/mcreator/superbwarfare/network/message/FireMessage.java index 9c4cd7a34..9542b0bee 100644 --- a/src/main/java/net/mcreator/superbwarfare/network/message/FireMessage.java +++ b/src/main/java/net/mcreator/superbwarfare/network/message/FireMessage.java @@ -212,12 +212,14 @@ public class FireMessage { float velocity = 4 * (float) tag.getDouble("speed"); int monsterMultiple = EnchantmentHelper.getTagEnchantmentLevel(ModEnchantments.MONSTER_HUNTER.get(), heldItem); boolean zoom = player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables()).zoom; + float bypassArmorRate = (float) heldItem.getOrCreateTag().getDouble("BypassesArmor"); var projectile = new ProjectileEntity(player.level()) .shooter(player) .headShot(headshot) .monsterMultiple(monsterMultiple) - .zoom(zoom); + .zoom(zoom) + .bypassArmorRate(bypassArmorRate); if (tag.getBoolean("beast")) { projectile.beast(); diff --git a/src/main/java/net/mcreator/superbwarfare/tools/DamageTypeTool.java b/src/main/java/net/mcreator/superbwarfare/tools/DamageTypeTool.java new file mode 100644 index 000000000..eb2dd0710 --- /dev/null +++ b/src/main/java/net/mcreator/superbwarfare/tools/DamageTypeTool.java @@ -0,0 +1,43 @@ +package net.mcreator.superbwarfare.tools; + +import net.mcreator.superbwarfare.init.ModDamageTypes; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.damagesource.DamageType; + +public class DamageTypeTool { + + public static boolean isArrowDamage(DamageSource source) { + return source.is(ModDamageTypes.ARROW_IN_BRAIN) || source.is(ModDamageTypes.ARROW_IN_KNEE) + || source.is(ModDamageTypes.ARROW_IN_BRAIN_ABSOLUTE) || source.is(ModDamageTypes.ARROW_IN_KNEE_ABSOLUTE); + } + + public static boolean isArrowDamage(ResourceKey damageType) { + return damageType == ModDamageTypes.ARROW_IN_BRAIN || damageType == ModDamageTypes.ARROW_IN_KNEE + || damageType == ModDamageTypes.ARROW_IN_BRAIN_ABSOLUTE || damageType == ModDamageTypes.ARROW_IN_KNEE_ABSOLUTE; + } + + public static boolean isGunDamage(DamageSource source) { + return source.is(ModDamageTypes.GUN_FIRE) || source.is(ModDamageTypes.GUN_FIRE_HEADSHOT) + || source.is(ModDamageTypes.GUN_FIRE_ABSOLUTE) || source.is(ModDamageTypes.GUN_FIRE_HEADSHOT_ABSOLUTE); + } + + public static boolean isGunDamage(ResourceKey damageType) { + return damageType == ModDamageTypes.GUN_FIRE || damageType == ModDamageTypes.GUN_FIRE_HEADSHOT + || 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) + || source.is(ModDamageTypes.ARROW_IN_BRAIN) || source.is(ModDamageTypes.ARROW_IN_BRAIN_ABSOLUTE); + } + + public static boolean isGunFireDamage(DamageSource source) { + return source.is(ModDamageTypes.GUN_FIRE) || source.is(ModDamageTypes.GUN_FIRE_ABSOLUTE); + } + +}