重构击杀信息渲染

This commit is contained in:
17146 2025-05-05 15:52:28 +08:00 committed by Light_Quanta
parent 8d97fdd7ba
commit cf2a2999cc
No known key found for this signature in database
GPG key ID: 11A39A1B8C890959

View file

@ -21,6 +21,7 @@ import net.minecraft.core.registries.Registries;
import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.damagesource.DamageTypes; import net.minecraft.world.damagesource.DamageTypes;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.Dist;
import net.neoforged.api.distmarker.OnlyIn; import net.neoforged.api.distmarker.OnlyIn;
@ -130,14 +131,8 @@ public class KillMessageOverlay implements LayeredDraw.Layer {
Font font = Minecraft.getInstance().font; Font font = Minecraft.getInstance().font;
AtomicReference<String> targetName = new AtomicReference<>(record.target.getDisplayName().getString()); String targetName = getEntityName(record.target);
if (record.target instanceof Player targetPlayer) { int targetNameWidth = font.width(targetName);
CuriosApi.getCuriosInventory(targetPlayer)
.flatMap(c -> c.findFirstCurio(ModItems.DOG_TAG.get()))
.ifPresent(s -> targetName.set(s.stack().getHoverName().getString()));
}
int targetNameWidth = font.width(targetName.get());
guiGraphics.pose().pushPose(); guiGraphics.pose().pushPose();
@ -166,26 +161,26 @@ public class KillMessageOverlay implements LayeredDraw.Layer {
} }
// 击杀提示默认是右对齐的这里从右向左渲染 // 击杀提示默认是右对齐的这里从右向左渲染
if (!left) {
float currentPosX = width - targetNameWidth - 10f;
// 渲染被击杀者名称 // 渲染被击杀者名称
guiGraphics.drawString( guiGraphics.drawString(
Minecraft.getInstance().font, Minecraft.getInstance().font,
targetName.get(), targetName,
width - targetNameWidth - 10f, currentPosX,
top, top,
record.target.getTeamColor(), record.target.getTeamColor(),
false false
); );
// 第一个图标爆头/爆炸/近战等图标 // 渲染伤害类型图标
int damageTypeIconW = width - targetNameWidth - 28;
ResourceLocation damageTypeIcon = getDamageTypeIcon(record); ResourceLocation damageTypeIcon = getDamageTypeIcon(record);
if (damageTypeIcon != null) { if (damageTypeIcon != null) {
currentPosX -= 18;
preciseBlit(guiGraphics, preciseBlit(guiGraphics,
damageTypeIcon, damageTypeIcon,
damageTypeIconW, currentPosX,
top - 2, top - 2,
0, 0,
0, 0,
@ -196,20 +191,13 @@ public class KillMessageOverlay implements LayeredDraw.Layer {
); );
} }
Player player = record.attacker; // 渲染武器图标
boolean renderItem = false; ResourceLocation currentWeaponIcon = getWeaponIcon(record);
int itemIconW = damageTypeIcon != null ? width - targetNameWidth - 64 : width - targetNameWidth - 46; if (currentWeaponIcon != null) {
currentPosX -= 36;
if (player != null && player.getVehicle() instanceof VehicleEntity vehicleEntity) {
// 载具图标
if ((vehicleEntity instanceof ArmedVehicleEntity iArmedVehicle && iArmedVehicle.banHand(player)) || record.damageType == ModDamageTypes.VEHICLE_STRIKE) {
renderItem = true;
ResourceLocation resourceLocation = vehicleEntity.getVehicleIcon();
preciseBlit(guiGraphics, preciseBlit(guiGraphics,
resourceLocation, currentWeaponIcon,
itemIconW, currentPosX,
top, top,
0, 0,
0, 0,
@ -218,86 +206,80 @@ public class KillMessageOverlay implements LayeredDraw.Layer {
-32, -32,
8 8
); );
} else {
if (record.stack.getItem() instanceof GunItem gunItem) {
renderItem = true;
ResourceLocation resourceLocation = gunItem.getGunIcon();
preciseBlit(guiGraphics,
resourceLocation,
itemIconW,
top,
0,
0,
32,
8,
-32,
8
);
}
}
} else {
// 如果是枪械击杀则渲染枪械图标
if (record.stack.getItem() instanceof GunItem gunItem) {
renderItem = true;
ResourceLocation resourceLocation = gunItem.getGunIcon();
preciseBlit(guiGraphics,
resourceLocation,
itemIconW,
top,
0,
0,
32,
8,
-32,
8
);
}
// TODO 如果是特殊武器击杀则渲染对应图标
if (record.stack.getItem().getDescriptionId().equals("item.dreamaticvoyage.world_peace_staff")) {
renderItem = true;
preciseBlit(guiGraphics,
WORLD_PEACE_STAFF,
itemIconW,
top,
0,
0,
32,
8,
32,
8
);
}
} }
// 渲染击杀者名称 // 渲染击杀者名称
AtomicReference<String> attackerName = new AtomicReference<>(record.attacker.getDisplayName().getString()); String attackerName = getEntityName(record.attacker);
CuriosApi.getCuriosInventory(record.attacker) currentPosX -= font.width(attackerName) + 6;
.flatMap(c -> c.findFirstCurio(ModItems.DOG_TAG.get()))
.ifPresent(s -> attackerName.set(s.stack().getHoverName().getString()));
int attackerNameWidth = font.width(attackerName.get());
int nameW = width - targetNameWidth - 16 - attackerNameWidth;
if (renderItem) {
nameW -= 32;
}
if (damageTypeIcon != null) {
nameW -= 18;
}
guiGraphics.drawString( guiGraphics.drawString(
Minecraft.getInstance().font, Minecraft.getInstance().font,
attackerName.get(), attackerName,
nameW, currentPosX,
top, top,
record.attacker.getTeamColor(), record.attacker.getTeamColor(),
false false
); );
} else {
float currentPosX = width + 10f;
// 渲染击杀者名称
String attackerName = getEntityName(record.attacker);
guiGraphics.drawString(
Minecraft.getInstance().font,
attackerName,
currentPosX,
top,
record.attacker.getTeamColor(),
false
);
currentPosX += font.width(attackerName) + 6;
// 渲染武器图标
ResourceLocation currentWeaponIcon = getWeaponIcon(record);
if (currentWeaponIcon != null) {
preciseBlit(guiGraphics,
currentWeaponIcon,
currentPosX,
top,
0,
0,
32,
8,
-32,
8
);
currentPosX += 36;
}
// 渲染伤害类型图标
ResourceLocation damageTypeIcon = getDamageTypeIcon(record);
if (damageTypeIcon != null) {
preciseBlit(guiGraphics,
damageTypeIcon,
currentPosX,
top - 2,
0,
0,
12,
12,
12,
12
);
currentPosX += 18;
}
// 渲染被击杀者名称
guiGraphics.drawString(
Minecraft.getInstance().font,
targetName,
currentPosX,
top,
record.target.getTeamColor(),
false
);
}
RenderSystem.defaultBlendFunc(); RenderSystem.defaultBlendFunc();
RenderSystem.disableBlend(); RenderSystem.disableBlend();
@ -350,4 +332,40 @@ public class KillMessageOverlay implements LayeredDraw.Layer {
} }
return icon; return icon;
} }
public static String getEntityName(Entity entity) {
AtomicReference<String> targetName = new AtomicReference<>(entity.getDisplayName().getString());
if (entity instanceof Player targetPlayer) {
CuriosApi.getCuriosInventory(targetPlayer)
.flatMap(c -> c.findFirstCurio(ModItems.DOG_TAG.get()))
.ifPresent(s -> targetName.set(s.stack().getHoverName().getString()));
}
return targetName.get();
}
@Nullable
public static ResourceLocation getWeaponIcon(PlayerKillRecord record) {
Player player = record.attacker;
if (player != null && player.getVehicle() instanceof VehicleEntity vehicleEntity) {
// 载具图标
if ((vehicleEntity instanceof ArmedVehicleEntity iArmedVehicle && iArmedVehicle.banHand(player)) || record.damageType == ModDamageTypes.VEHICLE_STRIKE) {
return vehicleEntity.getVehicleIcon();
} else {
if (record.stack.getItem() instanceof GunItem gunItem) {
return gunItem.getGunIcon();
}
}
} else {
// 如果是枪械击杀则渲染枪械图标
if (record.stack.getItem() instanceof GunItem gunItem) {
return gunItem.getGunIcon();
}
// TODO 如果是特殊武器击杀则渲染对应图标
if (record.stack.getItem().getDescriptionId().equals("item.dreamaticvoyage.world_peace_staff")) {
return WORLD_PEACE_STAFF;
}
}
return null;
}
} }