diff --git a/src/main/java/net/mcreator/target/TargetMod.java b/src/main/java/net/mcreator/target/TargetMod.java index 9fcd4dda2..00e24e3fd 100644 --- a/src/main/java/net/mcreator/target/TargetMod.java +++ b/src/main/java/net/mcreator/target/TargetMod.java @@ -91,6 +91,6 @@ public class TargetMod { addNetworkMessage(FireModeMessage.class, FireModeMessage::buffer, FireModeMessage::new, FireModeMessage::handler); addNetworkMessage(GunRecycleGuiButtonMessage.class, GunRecycleGuiButtonMessage::buffer, GunRecycleGuiButtonMessage::new, GunRecycleGuiButtonMessage::handler); addNetworkMessage(ReloadMessage.class, ReloadMessage::buffer, ReloadMessage::new, ReloadMessage::handler); - addNetworkMessage(PlayerKillMessage.class, PlayerKillMessage::encode, PlayerKillMessage::decode, PlayerKillMessage::handler, Optional.of(NetworkDirection.PLAY_TO_CLIENT)); + addNetworkMessage(PlayerGunKillMessage.class, PlayerGunKillMessage::encode, PlayerGunKillMessage::decode, PlayerGunKillMessage::handler, Optional.of(NetworkDirection.PLAY_TO_CLIENT)); } } 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 106f9af10..2a6be8313 100644 --- a/src/main/java/net/mcreator/target/client/screens/KillMessageOverlay.java +++ b/src/main/java/net/mcreator/target/client/screens/KillMessageOverlay.java @@ -50,17 +50,33 @@ public class KillMessageOverlay { int attackerNameWidth = font.width(attackerName); int targetNameWidth = font.width(targetName); - int nameW = record.headshot ? w - targetNameWidth - 68 - attackerNameWidth : w - targetNameWidth - 50 - attackerNameWidth; + // 击杀提示是右对齐的,这里从右向左渲染 + // 渲染被击杀者名称 event.getGuiGraphics().drawString( Minecraft.getInstance().font, - attackerName, - nameW, + targetName, + w - targetNameWidth - 10f, h, - record.attacker.getTeamColor(), + record.target.getTeamColor(), false ); + // 渲染爆头图标 + if (record.headshot) { + event.getGuiGraphics().blit(HEADSHOT, + w - targetNameWidth - 28, + h - 2, + 0, + 0, + 12, + 12, + 12, + 12 + ); + } + + // 如果是枪械击杀,则渲染枪械图标 if (record.stack.getItem() instanceof GunItem gunItem) { ResourceLocation resourceLocation = gunItem.getGunIcon(); @@ -78,26 +94,17 @@ public class KillMessageOverlay { ); } - if (record.headshot) { - event.getGuiGraphics().blit(HEADSHOT, - w - targetNameWidth - 28, - h - 2, - 0, - 0, - 12, - 12, - 12, - 12 - ); - } + // 渲染击杀者名称 + int nameW = record.headshot ? w - targetNameWidth - 68 - attackerNameWidth : w - targetNameWidth - 50 - attackerNameWidth; event.getGuiGraphics().drawString( Minecraft.getInstance().font, - targetName, - w - targetNameWidth - 10f, + attackerName, + nameW, h, - record.target.getTeamColor(), + record.attacker.getTeamColor(), false ); + } } diff --git a/src/main/java/net/mcreator/target/event/LivingEntityEventHandler.java b/src/main/java/net/mcreator/target/event/LivingEntityEventHandler.java index 3c0bdd471..63caf915f 100644 --- a/src/main/java/net/mcreator/target/event/LivingEntityEventHandler.java +++ b/src/main/java/net/mcreator/target/event/LivingEntityEventHandler.java @@ -8,7 +8,7 @@ import net.mcreator.target.init.TargetModSounds; import net.mcreator.target.init.TargetModTags; import net.mcreator.target.item.gun.GunItem; import net.mcreator.target.network.TargetModVariables; -import net.mcreator.target.network.message.PlayerKillMessage; +import net.mcreator.target.network.message.PlayerGunKillMessage; import net.mcreator.target.tools.SoundTool; import net.minecraft.core.registries.Registries; import net.minecraft.network.protocol.game.ClientboundStopSoundPacket; @@ -18,6 +18,7 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundSource; import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.damagesource.DamageType; import net.minecraft.world.damagesource.DamageTypes; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EquipmentSlot; @@ -217,11 +218,13 @@ public class LivingEntityEventHandler { return; } + ResourceKey damageTypeResourceKey = source.typeHolder().unwrapKey().isPresent() ? source.typeHolder().unwrapKey().get() : DamageTypes.GENERIC; + if (source.getDirectEntity() instanceof ServerPlayer player) { - if (source.is(TargetModDamageTypes.GUN_FIRE) || source.is(TargetModDamageTypes.ARROW_IN_KNEE)) { - TargetMod.PACKET_HANDLER.send(PacketDistributor.ALL.noArg(), new PlayerKillMessage(player.getId(), entity.getId(), false)); - } else if (source.is(TargetModDamageTypes.GUN_FIRE_HEADSHOT) || source.is(TargetModDamageTypes.ARROW_IN_BRAIN)) { - TargetMod.PACKET_HANDLER.send(PacketDistributor.ALL.noArg(), new PlayerKillMessage(player.getId(), entity.getId(), true)); + 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)); + } else { + TargetMod.PACKET_HANDLER.send(PacketDistributor.ALL.noArg(), new PlayerGunKillMessage(player.getId(), entity.getId(), false, damageTypeResourceKey)); } } } diff --git a/src/main/java/net/mcreator/target/network/ClientPacketHandler.java b/src/main/java/net/mcreator/target/network/ClientPacketHandler.java index eb565cbfa..3cf752e57 100644 --- a/src/main/java/net/mcreator/target/network/ClientPacketHandler.java +++ b/src/main/java/net/mcreator/target/network/ClientPacketHandler.java @@ -4,6 +4,8 @@ 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.resources.ResourceKey; +import net.minecraft.world.damagesource.DamageType; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraftforge.fml.LogicalSide; @@ -19,9 +21,9 @@ public class ClientPacketHandler { } } - public static void handlePlayerKillMessage(Player attacker, Entity target, boolean headshot, Supplier ctx) { + public static void handlePlayerKillMessage(Player attacker, Entity target, boolean headshot, ResourceKey damageType, Supplier ctx) { if (ctx.get().getDirection().getReceptionSide() == LogicalSide.CLIENT) { - KillMessageHandler.QUEUE.offer(new PlayerKillRecord(attacker, target, attacker.getMainHandItem(), headshot)); + KillMessageHandler.QUEUE.offer(new PlayerKillRecord(attacker, target, attacker.getMainHandItem(), headshot, damageType)); } } } diff --git a/src/main/java/net/mcreator/target/network/message/PlayerKillMessage.java b/src/main/java/net/mcreator/target/network/message/PlayerGunKillMessage.java similarity index 63% rename from src/main/java/net/mcreator/target/network/message/PlayerKillMessage.java rename to src/main/java/net/mcreator/target/network/message/PlayerGunKillMessage.java index ae9c27e19..735fb0d38 100644 --- a/src/main/java/net/mcreator/target/network/message/PlayerKillMessage.java +++ b/src/main/java/net/mcreator/target/network/message/PlayerGunKillMessage.java @@ -3,7 +3,10 @@ package net.mcreator.target.network.message; import net.mcreator.target.network.ClientPacketHandler; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.core.registries.Registries; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.damagesource.DamageType; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraftforge.api.distmarker.Dist; @@ -12,31 +15,35 @@ import net.minecraftforge.network.NetworkEvent; import java.util.function.Supplier; -public class PlayerKillMessage { +public class PlayerGunKillMessage { public final int attackerId; public final int targetId; public final boolean headshot; + public final ResourceKey damageType; - public PlayerKillMessage(int attackerId, int targetId, boolean headshot) { + public PlayerGunKillMessage(int attackerId, int targetId, boolean headshot, ResourceKey damageType) { this.attackerId = attackerId; this.targetId = targetId; this.headshot = headshot; + this.damageType = damageType; } - public static void encode(PlayerKillMessage message, FriendlyByteBuf buffer) { + public static void encode(PlayerGunKillMessage message, FriendlyByteBuf buffer) { buffer.writeInt(message.attackerId); buffer.writeInt(message.targetId); buffer.writeBoolean(message.headshot); + buffer.writeResourceKey(message.damageType); } - public static PlayerKillMessage decode(FriendlyByteBuf buffer) { + public static PlayerGunKillMessage decode(FriendlyByteBuf buffer) { int attackerId = buffer.readInt(); int targetId = buffer.readInt(); boolean headshot = buffer.readBoolean(); - return new PlayerKillMessage(attackerId, targetId, headshot); + ResourceKey damageType = buffer.readResourceKey(Registries.DAMAGE_TYPE); + return new PlayerGunKillMessage(attackerId, targetId, headshot, damageType); } - public static void handler(PlayerKillMessage message, Supplier ctx) { + public static void handler(PlayerGunKillMessage message, Supplier ctx) { ctx.get().enqueueWork(() -> { ClientLevel level = Minecraft.getInstance().level; if (level != null) { @@ -44,7 +51,7 @@ public class PlayerKillMessage { Entity target = level.getEntity(message.targetId); if (player != null && target != null) { - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> ClientPacketHandler.handlePlayerKillMessage(player, target, message.headshot, ctx)); + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> ClientPacketHandler.handlePlayerKillMessage(player, target, message.headshot, message.damageType, ctx)); } } }); diff --git a/src/main/java/net/mcreator/target/tools/PlayerKillRecord.java b/src/main/java/net/mcreator/target/tools/PlayerKillRecord.java index bcbb9da88..3b5ff8f0b 100644 --- a/src/main/java/net/mcreator/target/tools/PlayerKillRecord.java +++ b/src/main/java/net/mcreator/target/tools/PlayerKillRecord.java @@ -1,5 +1,7 @@ package net.mcreator.target.tools; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.damagesource.DamageType; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -10,12 +12,14 @@ public class PlayerKillRecord { public ItemStack stack; public boolean headshot; public int tick; + public ResourceKey damageType; - public PlayerKillRecord(Player attacker, Entity target, ItemStack stack, boolean headshot) { + public PlayerKillRecord(Player attacker, Entity target, ItemStack stack, boolean headshot, ResourceKey damageType) { this.attacker = attacker; this.target = target; this.stack = stack; this.headshot = headshot; this.tick = 0; + this.damageType = damageType; } }