From 305bd29bba52d274800f4d04355a64c6f0b92f12 Mon Sep 17 00:00:00 2001 From: 17146 <1714673995@qq.com> Date: Sun, 19 May 2024 01:08:45 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=96=B0=E7=9A=84=E4=BC=A4?= =?UTF-8?q?=E5=AE=B3=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../target/entity/ProjectileEntity.java | 2 +- .../target/event/KillMessageHandler.java | 29 +++++++++++++++++++ .../event/LivingEntityEventHandler.java | 8 +++-- .../target/init/TargetModDamageTypes.java | 9 ++++-- .../target/mixins/LivingEntityMixin.java | 2 +- .../target/network/ClientPacketHandler.java | 6 ++-- .../network/message/PlayerKillMessage.java | 10 +++++-- .../target/tools/PlayerKillRecord.java | 21 ++++++++++++++ .../resources/assets/target/lang/en_us.json | 9 +++--- .../resources/assets/target/lang/zh_cn.json | 10 ++++--- .../tags/damage_type/bypasses_armor.json | 3 +- .../tags/damage_type/bypasses_effects.json | 3 +- .../damage_type/bypasses_enchantments.json | 3 +- .../tags/damage_type/bypasses_resistance.json | 3 +- .../target/damage_type/gunfire_headshot.json | 5 ++++ 15 files changed, 99 insertions(+), 24 deletions(-) create mode 100644 src/main/java/net/mcreator/target/event/KillMessageHandler.java create mode 100644 src/main/java/net/mcreator/target/tools/PlayerKillRecord.java create mode 100644 src/main/resources/data/target/damage_type/gunfire_headshot.json diff --git a/src/main/java/net/mcreator/target/entity/ProjectileEntity.java b/src/main/java/net/mcreator/target/entity/ProjectileEntity.java index 78466ec3c..9b0cd18ca 100644 --- a/src/main/java/net/mcreator/target/entity/ProjectileEntity.java +++ b/src/main/java/net/mcreator/target/entity/ProjectileEntity.java @@ -350,7 +350,7 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa capability.syncPlayerVariables(shooter); }); - entity.hurt(TargetModDamageTypes.causeGunFireDamage(this.level().registryAccess(), this.shooter), this.damage * this.headShot); + entity.hurt(TargetModDamageTypes.causeGunFireHeadshotDamage(this.level().registryAccess(), this.shooter), this.damage * this.headShot); } else { if (!this.shooter.level().isClientSide() && this.shooter instanceof ServerPlayer player) { var holder = Holder.direct(TargetModSounds.INDICATION.get()); diff --git a/src/main/java/net/mcreator/target/event/KillMessageHandler.java b/src/main/java/net/mcreator/target/event/KillMessageHandler.java new file mode 100644 index 000000000..b197a761c --- /dev/null +++ b/src/main/java/net/mcreator/target/event/KillMessageHandler.java @@ -0,0 +1,29 @@ +package net.mcreator.target.event; + +import net.mcreator.target.tools.PlayerKillRecord; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.event.TickEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; + +import java.util.ArrayDeque; +import java.util.Queue; + +@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.FORGE, value = Dist.CLIENT) +public class KillMessageHandler { + + public static Queue QUEUE = new ArrayDeque<>(); + + @SubscribeEvent + public static void onClientTick(TickEvent.ClientTickEvent event) { + if (event.phase == TickEvent.Phase.END) { + for (PlayerKillRecord record : QUEUE) { + record.tick++; + if (record.tick >= 100) { + QUEUE.poll(); + } + } + } + } + +} diff --git a/src/main/java/net/mcreator/target/event/LivingEntityEventHandler.java b/src/main/java/net/mcreator/target/event/LivingEntityEventHandler.java index 80b0868f5..27c78350a 100644 --- a/src/main/java/net/mcreator/target/event/LivingEntityEventHandler.java +++ b/src/main/java/net/mcreator/target/event/LivingEntityEventHandler.java @@ -73,7 +73,7 @@ public class LivingEntityEventHandler { stack.getOrCreateTag().putDouble("damagetotal", stack.getOrCreateTag().getDouble("damagetotal") + damage); } - if (damagesource.is(TargetModDamageTypes.GUNFIRE)) { + if (damagesource.is(TargetModDamageTypes.GUN_FIRE)) { double distance = entity.position().distanceTo(sourceentity.position()); if (stack.is(TargetModTags.Items.SHOTGUN) || stack.getItem() == TargetModItems.BOCEK.get()) { @@ -225,8 +225,10 @@ public class LivingEntityEventHandler { DamageSource source = event.getSource(); if (source.getDirectEntity() instanceof ServerPlayer player) { - if (source.is(TargetModDamageTypes.GUNFIRE)) { - TargetMod.PACKET_HANDLER.send(PacketDistributor.PLAYER.with(() -> player), new PlayerKillMessage(player.getId(), entity.getId())); + if (source.is(TargetModDamageTypes.GUN_FIRE)) { + TargetMod.PACKET_HANDLER.send(PacketDistributor.PLAYER.with(() -> player), new PlayerKillMessage(player.getId(), entity.getId(), false)); + } else if (source.is(TargetModDamageTypes.GUN_FIRE_HEADSHOT)) { + TargetMod.PACKET_HANDLER.send(PacketDistributor.PLAYER.with(() -> player), new PlayerKillMessage(player.getId(), entity.getId(), true)); } } } diff --git a/src/main/java/net/mcreator/target/init/TargetModDamageTypes.java b/src/main/java/net/mcreator/target/init/TargetModDamageTypes.java index d161c6048..5c4bac287 100644 --- a/src/main/java/net/mcreator/target/init/TargetModDamageTypes.java +++ b/src/main/java/net/mcreator/target/init/TargetModDamageTypes.java @@ -16,13 +16,18 @@ import javax.annotation.Nullable; @SuppressWarnings("OptionalGetWithoutIsPresent") public class TargetModDamageTypes { - public static final ResourceKey GUNFIRE = ResourceKey.create(Registries.DAMAGE_TYPE, new ResourceLocation(TargetMod.MODID, "gunfire")); + public static final ResourceKey GUN_FIRE = ResourceKey.create(Registries.DAMAGE_TYPE, new ResourceLocation(TargetMod.MODID, "gunfire")); + public static final ResourceKey GUN_FIRE_HEADSHOT = ResourceKey.create(Registries.DAMAGE_TYPE, new ResourceLocation(TargetMod.MODID, "gunfire_headshot")); public static final ResourceKey ARROW_IN_BRAIN = ResourceKey.create(Registries.DAMAGE_TYPE, new ResourceLocation(TargetMod.MODID, "arrow_in_brain")); public static final ResourceKey MINE = ResourceKey.create(Registries.DAMAGE_TYPE, new ResourceLocation(TargetMod.MODID, "mine")); public static DamageSource causeGunFireDamage(RegistryAccess registryAccess, @Nullable Entity entity) { - return new DamageMessages(registryAccess.registry(Registries.DAMAGE_TYPE).get().getHolderOrThrow(GUNFIRE), entity); + return new DamageMessages(registryAccess.registry(Registries.DAMAGE_TYPE).get().getHolderOrThrow(GUN_FIRE), entity); + } + + public static DamageSource causeGunFireHeadshotDamage(RegistryAccess registryAccess, @Nullable Entity entity) { + return new DamageMessages(registryAccess.registry(Registries.DAMAGE_TYPE).get().getHolderOrThrow(GUN_FIRE_HEADSHOT), entity); } public static DamageSource causeArrowInBrainDamage(RegistryAccess registryAccess, @Nullable Entity entity) { diff --git a/src/main/java/net/mcreator/target/mixins/LivingEntityMixin.java b/src/main/java/net/mcreator/target/mixins/LivingEntityMixin.java index 62fe8adcb..5be2eedfa 100644 --- a/src/main/java/net/mcreator/target/mixins/LivingEntityMixin.java +++ b/src/main/java/net/mcreator/target/mixins/LivingEntityMixin.java @@ -22,7 +22,7 @@ public class LivingEntityMixin { @ModifyArg(method = "hurt", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;knockback(DDD)V"), index = 0) private double modifyApplyKnockbackArgs(double original) { - if (this.target$source.is(TargetModDamageTypes.GUNFIRE)) { + if (this.target$source.is(TargetModDamageTypes.GUN_FIRE)) { return 0.1 * original; } return original; diff --git a/src/main/java/net/mcreator/target/network/ClientPacketHandler.java b/src/main/java/net/mcreator/target/network/ClientPacketHandler.java index a3836214f..eb565cbfa 100644 --- a/src/main/java/net/mcreator/target/network/ClientPacketHandler.java +++ b/src/main/java/net/mcreator/target/network/ClientPacketHandler.java @@ -1,7 +1,9 @@ package net.mcreator.target.network; +import net.mcreator.target.event.KillMessageHandler; import net.mcreator.target.network.message.GunsDataMessage; import net.mcreator.target.tools.GunsTool; +import net.mcreator.target.tools.PlayerKillRecord; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraftforge.fml.LogicalSide; @@ -17,9 +19,9 @@ public class ClientPacketHandler { } } - public static void handlePlayerKillMessage(Player attacker, Entity target, Supplier ctx) { + public static void handlePlayerKillMessage(Player attacker, Entity target, boolean headshot, Supplier ctx) { if (ctx.get().getDirection().getReceptionSide() == LogicalSide.CLIENT) { - System.out.println(attacker + " killed " + target); + KillMessageHandler.QUEUE.offer(new PlayerKillRecord(attacker, target, attacker.getMainHandItem(), headshot)); } } } diff --git a/src/main/java/net/mcreator/target/network/message/PlayerKillMessage.java b/src/main/java/net/mcreator/target/network/message/PlayerKillMessage.java index ae3f2b2d4..ae9c27e19 100644 --- a/src/main/java/net/mcreator/target/network/message/PlayerKillMessage.java +++ b/src/main/java/net/mcreator/target/network/message/PlayerKillMessage.java @@ -15,21 +15,25 @@ import java.util.function.Supplier; public class PlayerKillMessage { public final int attackerId; public final int targetId; + public final boolean headshot; - public PlayerKillMessage(int attackerId, int targetId) { + public PlayerKillMessage(int attackerId, int targetId, boolean headshot) { this.attackerId = attackerId; this.targetId = targetId; + this.headshot = headshot; } public static void encode(PlayerKillMessage message, FriendlyByteBuf buffer) { buffer.writeInt(message.attackerId); buffer.writeInt(message.targetId); + buffer.writeBoolean(message.headshot); } public static PlayerKillMessage decode(FriendlyByteBuf buffer) { int attackerId = buffer.readInt(); int targetId = buffer.readInt(); - return new PlayerKillMessage(attackerId, targetId); + boolean headshot = buffer.readBoolean(); + return new PlayerKillMessage(attackerId, targetId, headshot); } public static void handler(PlayerKillMessage message, Supplier ctx) { @@ -40,7 +44,7 @@ public class PlayerKillMessage { Entity target = level.getEntity(message.targetId); if (player != null && target != null) { - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> ClientPacketHandler.handlePlayerKillMessage(player, target, ctx)); + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> ClientPacketHandler.handlePlayerKillMessage(player, target, message.headshot, ctx)); } } }); diff --git a/src/main/java/net/mcreator/target/tools/PlayerKillRecord.java b/src/main/java/net/mcreator/target/tools/PlayerKillRecord.java new file mode 100644 index 000000000..bcbb9da88 --- /dev/null +++ b/src/main/java/net/mcreator/target/tools/PlayerKillRecord.java @@ -0,0 +1,21 @@ +package net.mcreator.target.tools; + +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; + +public class PlayerKillRecord { + public Player attacker; + public Entity target; + public ItemStack stack; + public boolean headshot; + public int tick; + + public PlayerKillRecord(Player attacker, Entity target, ItemStack stack, boolean headshot) { + this.attacker = attacker; + this.target = target; + this.stack = stack; + this.headshot = headshot; + this.tick = 0; + } +} diff --git a/src/main/resources/assets/target/lang/en_us.json b/src/main/resources/assets/target/lang/en_us.json index 2e6180569..6e1d16653 100644 --- a/src/main/resources/assets/target/lang/en_us.json +++ b/src/main/resources/assets/target/lang/en_us.json @@ -152,12 +152,13 @@ "death.attack.gunfire": "%1$s was shoot by %2$s", "death.attack.gunfire.entity": "%1$s was shoot by %2$s", - "death.attack.gunfire.item": "%1$s was shoot by %2$s", - "death.attack.gunfire.player": "%1$s was shoot by %2$s", - + "death.attack.gunfire.item": "%1$s was shoot by %2$s using %3$s", + "death.attack.gunfire_headshot": "%1$s was headshot by %2$s", + "death.attack.gunfire_headshot.entity": "%1$s was headshot by %2$s", + "death.attack.gunfire_headshot.item": "%1$s was headshot by %2$s using %3$s", "death.attack.arrow_in_brain": "%2$s's arrow shot into %1$s's brain", "death.attack.arrow_in_brain.item": "An arrow shot into %1$s's brain,murderer is %2$s used %3$s", - "death.attack.arrow_in_brain.player": "An arrow shot into %1$s's brain whilst trying to escape %2$s", + "death.attack.arrow_in_brain.entity": "An arrow shot into %1$s's brain whilst trying to escape %2$s", "death.attack.beast_gun": "%1$s was killed by %2$s using BEAST guns", "Shell Estimated Range": "Estimated Range:", diff --git a/src/main/resources/assets/target/lang/zh_cn.json b/src/main/resources/assets/target/lang/zh_cn.json index eed91f2b4..f61834d13 100644 --- a/src/main/resources/assets/target/lang/zh_cn.json +++ b/src/main/resources/assets/target/lang/zh_cn.json @@ -153,10 +153,12 @@ "death.attack.gunfire": "%1$s被%2$s射爆了", "death.attack.gunfire.entity": "%1$s被%2$s射爆了", "death.attack.gunfire.item": "%1$s被%2$s用%3$s射爆了", - "death.attack.gunfire.player": "%1$s在逃离%2$s的时候被射爆了", - "death.attack.arrow_in_brain": "%1$s的脑子进矢了,凶手是%2$s", - "death.attack.arrow_in_brain.item": "%1$s的脑子进矢了,凶手%2$s使用了%3$s", - "death.attack.arrow_in_brain.player": "%1$s在逃离%2$s的时候脑子进矢了", + "death.attack.gunfire_headshot": "%1$s被%2$s射爆了脑袋", + "death.attack.gunfire_headshot.entity": "%1$s被%2$s射爆了脑袋", + "death.attack.gunfire_headshot.item": "%1$s被%2$s用%3$s射爆了脑袋", + "death.attack.arrow_in_brain": "%1$s的脑子进矢了,凶手是%2$s", + "death.attack.arrow_in_brain.item": "%1$s的脑子进矢了,凶手%2$s使用了%3$s", + "death.attack.arrow_in_brain.entity": "%1$s在逃离%2$s的时候脑子进矢了", "death.attack.beast_gun": "%1$s被%2$s用BEAST枪械臭炸了", "Shell Estimated Range": "炮弹预估射程:", diff --git a/src/main/resources/data/minecraft/tags/damage_type/bypasses_armor.json b/src/main/resources/data/minecraft/tags/damage_type/bypasses_armor.json index 485363b10..7c3ddfe79 100644 --- a/src/main/resources/data/minecraft/tags/damage_type/bypasses_armor.json +++ b/src/main/resources/data/minecraft/tags/damage_type/bypasses_armor.json @@ -1,6 +1,7 @@ { "replace": false, "values": [ - "target:gunfire" + "target:gunfire", + "target:gunfire_headshot" ] } \ No newline at end of file diff --git a/src/main/resources/data/minecraft/tags/damage_type/bypasses_effects.json b/src/main/resources/data/minecraft/tags/damage_type/bypasses_effects.json index 485363b10..7c3ddfe79 100644 --- a/src/main/resources/data/minecraft/tags/damage_type/bypasses_effects.json +++ b/src/main/resources/data/minecraft/tags/damage_type/bypasses_effects.json @@ -1,6 +1,7 @@ { "replace": false, "values": [ - "target:gunfire" + "target:gunfire", + "target:gunfire_headshot" ] } \ No newline at end of file diff --git a/src/main/resources/data/minecraft/tags/damage_type/bypasses_enchantments.json b/src/main/resources/data/minecraft/tags/damage_type/bypasses_enchantments.json index 485363b10..7c3ddfe79 100644 --- a/src/main/resources/data/minecraft/tags/damage_type/bypasses_enchantments.json +++ b/src/main/resources/data/minecraft/tags/damage_type/bypasses_enchantments.json @@ -1,6 +1,7 @@ { "replace": false, "values": [ - "target:gunfire" + "target:gunfire", + "target:gunfire_headshot" ] } \ No newline at end of file diff --git a/src/main/resources/data/minecraft/tags/damage_type/bypasses_resistance.json b/src/main/resources/data/minecraft/tags/damage_type/bypasses_resistance.json index 485363b10..7c3ddfe79 100644 --- a/src/main/resources/data/minecraft/tags/damage_type/bypasses_resistance.json +++ b/src/main/resources/data/minecraft/tags/damage_type/bypasses_resistance.json @@ -1,6 +1,7 @@ { "replace": false, "values": [ - "target:gunfire" + "target:gunfire", + "target:gunfire_headshot" ] } \ No newline at end of file diff --git a/src/main/resources/data/target/damage_type/gunfire_headshot.json b/src/main/resources/data/target/damage_type/gunfire_headshot.json new file mode 100644 index 000000000..fca347410 --- /dev/null +++ b/src/main/resources/data/target/damage_type/gunfire_headshot.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0, + "message_id": "gunfire_headshot", + "scaling": "never" +} \ No newline at end of file