diff --git a/src/main/java/net/mcreator/target/client/screens/KillMessageOverlay.java b/src/main/java/net/mcreator/target/client/screens/KillMessageOverlay.java index 2a6be8313..ee673c679 100644 --- a/src/main/java/net/mcreator/target/client/screens/KillMessageOverlay.java +++ b/src/main/java/net/mcreator/target/client/screens/KillMessageOverlay.java @@ -7,6 +7,7 @@ import net.mcreator.target.tools.PlayerKillRecord; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.damagesource.DamageTypes; import net.minecraft.world.entity.player.Player; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.RenderGuiEvent; @@ -18,6 +19,10 @@ import net.minecraftforge.fml.common.Mod; public class KillMessageOverlay { private static final ResourceLocation HEADSHOT = new ResourceLocation(TargetMod.MODID, "textures/screens/headshot.png"); + private static final ResourceLocation KNIFE = new ResourceLocation(TargetMod.MODID, "textures/screens/knife.png"); + private static final ResourceLocation EXPLOSION = new ResourceLocation(TargetMod.MODID, "textures/screens/explosion.png"); + private static final ResourceLocation CLAYMORE = new ResourceLocation(TargetMod.MODID, "textures/screens/claymore.png"); + @SubscribeEvent(priority = EventPriority.NORMAL) public static void eventHandler(RenderGuiEvent.Pre event) { Player player = Minecraft.getInstance().player; @@ -44,10 +49,7 @@ public class KillMessageOverlay { Font font = Minecraft.getInstance().font; - String attackerName = record.attacker.getDisplayName().getString(); String targetName = record.target.getDisplayName().getString(); - - int attackerNameWidth = font.width(attackerName); int targetNameWidth = font.width(targetName); // 击杀提示是右对齐的,这里从右向左渲染 @@ -76,12 +78,27 @@ public class KillMessageOverlay { ); } + // 如果是爆炸伤害,则渲染爆炸图标 + boolean explosion = false; + if (record.damageType == DamageTypes.EXPLOSION || record.damageType == DamageTypes.PLAYER_EXPLOSION) { + explosion = true; + int explosionW = w - targetNameWidth - 26; + event.getGuiGraphics().blit(EXPLOSION, + explosionW, + h - 2, + 0, + 0, + 12, + 12, + 12, + 12 + ); + } + // 如果是枪械击杀,则渲染枪械图标 if (record.stack.getItem() instanceof GunItem gunItem) { ResourceLocation resourceLocation = gunItem.getGunIcon(); - - int gunIconW = record.headshot ? w - targetNameWidth - 64 : w - targetNameWidth - 46; - + int gunIconW = (record.headshot || explosion) ? w - targetNameWidth - 64 : w - targetNameWidth - 46; event.getGuiGraphics().blit(resourceLocation, gunIconW, h, @@ -95,7 +112,9 @@ public class KillMessageOverlay { } // 渲染击杀者名称 - int nameW = record.headshot ? w - targetNameWidth - 68 - attackerNameWidth : w - targetNameWidth - 50 - attackerNameWidth; + String attackerName = record.attacker.getDisplayName().getString(); + int attackerNameWidth = font.width(attackerName); + int nameW = (record.headshot || explosion) ? w - targetNameWidth - 68 - attackerNameWidth : w - targetNameWidth - 50 - attackerNameWidth; event.getGuiGraphics().drawString( Minecraft.getInstance().font, diff --git a/src/main/java/net/mcreator/target/event/LivingEntityEventHandler.java b/src/main/java/net/mcreator/target/event/LivingEntityEventHandler.java index 63caf915f..093385236 100644 --- a/src/main/java/net/mcreator/target/event/LivingEntityEventHandler.java +++ b/src/main/java/net/mcreator/target/event/LivingEntityEventHandler.java @@ -24,6 +24,7 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.projectile.Projectile; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.LevelAccessor; import net.minecraftforge.event.entity.living.LivingAttackEvent; @@ -220,11 +221,19 @@ public class LivingEntityEventHandler { ResourceKey damageTypeResourceKey = source.typeHolder().unwrapKey().isPresent() ? source.typeHolder().unwrapKey().get() : DamageTypes.GENERIC; + ServerPlayer attacker = null; if (source.getDirectEntity() instanceof ServerPlayer player) { + attacker = player; + } + if (source.getDirectEntity() instanceof Projectile projectile && projectile.getOwner() instanceof ServerPlayer player) { + attacker = player; + } + + if (attacker != null) { if (source.is(TargetModDamageTypes.GUN_FIRE_HEADSHOT) || source.is(TargetModDamageTypes.ARROW_IN_BRAIN)) { - TargetMod.PACKET_HANDLER.send(PacketDistributor.ALL.noArg(), new PlayerGunKillMessage(player.getId(), entity.getId(), true, damageTypeResourceKey)); + TargetMod.PACKET_HANDLER.send(PacketDistributor.ALL.noArg(), new PlayerGunKillMessage(attacker.getId(), entity.getId(), true, damageTypeResourceKey)); } else { - TargetMod.PACKET_HANDLER.send(PacketDistributor.ALL.noArg(), new PlayerGunKillMessage(player.getId(), entity.getId(), false, damageTypeResourceKey)); + TargetMod.PACKET_HANDLER.send(PacketDistributor.ALL.noArg(), new PlayerGunKillMessage(attacker.getId(), entity.getId(), false, damageTypeResourceKey)); } } } diff --git a/src/main/resources/assets/target/textures/screens/claymore.png b/src/main/resources/assets/target/textures/screens/claymore.png new file mode 100644 index 000000000..83efced73 Binary files /dev/null and b/src/main/resources/assets/target/textures/screens/claymore.png differ diff --git a/src/main/resources/assets/target/textures/screens/explosion.png b/src/main/resources/assets/target/textures/screens/explosion.png new file mode 100644 index 000000000..a124709a2 Binary files /dev/null and b/src/main/resources/assets/target/textures/screens/explosion.png differ diff --git a/src/main/resources/assets/target/textures/screens/knife.png b/src/main/resources/assets/target/textures/screens/knife.png new file mode 100644 index 000000000..8551bc806 Binary files /dev/null and b/src/main/resources/assets/target/textures/screens/knife.png differ