Add name hologram renderer configuration

This commit is contained in:
fullwall 2024-07-06 18:33:10 +08:00
parent 957704dfc0
commit 25db02649e
2 changed files with 32 additions and 26 deletions

View File

@ -116,6 +116,9 @@ public class Settings {
"npc.hologram.default-renderer", "display"),
DEFAULT_LOOK_CLOSE("Enable look close by default", "npc.default.look-close.enabled", false),
DEFAULT_LOOK_CLOSE_RANGE("Default look close range in blocks", "npc.default.look-close.range", 10),
DEFAULT_NAME_HOLOGRAM_RENDERER(
"The default renderer for name holograms, must be one of the following:<br>interaction - matches inbuilt nametags most closely<br>display - allows for different colored backgrounds<br>display_vehicle - allows for different colored backgrounds<br>armorstand - the most stable option, very very small hit to client FPS compared to other options",
"npc.hologram.default-renderer", "display"),
DEFAULT_NPC_HOLOGRAM_LINE_HEIGHT("Default distance between hologram lines", "npc.hologram.default-line-height",
0.4D),
DEFAULT_NPC_LIMIT(

View File

@ -1,6 +1,5 @@
package net.citizensnpcs.trait;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
@ -125,10 +124,10 @@ public class HologramTrait extends Trait {
private HologramRenderer createDefaultHologramRenderer() {
HologramRenderer renderer;
String hologramSetting = Setting.DEFAULT_HOLOGRAM_RENDERER.asString();
if (!SUPPORTS_DISPLAY || hologramSetting.equalsIgnoreCase("armorstand")) {
if (!SUPPORTS_DISPLAY || hologramSetting.equals("armorstand")) {
renderer = new ArmorstandRenderer();
} else {
renderer = hologramSetting.equalsIgnoreCase("interaction") ? new InteractionVehicleRenderer()
renderer = hologramSetting.equals("interaction") ? new InteractionVehicleRenderer()
: new TextDisplayRenderer();
}
if (HologramRendererCreateEvent.handlers.getRegisteredListeners().length > 0) {
@ -141,13 +140,17 @@ public class HologramTrait extends Trait {
private HologramRenderer createNameRenderer() {
HologramRenderer renderer;
System.out.println(Arrays.asList(SpigotUtil.getVersion()));
if (SpigotUtil.getVersion()[1] >= 20) {
String setting = Setting.DEFAULT_NAME_HOLOGRAM_RENDERER.asString();
if (setting.equals("display")) {
renderer = new TextDisplayRenderer();
} else if (SpigotUtil.getVersion()[1] >= 20 && (setting.isEmpty() || setting.equals("display_vehicle"))) {
renderer = new TextDisplayVehicleRenderer();
} else if (SpigotUtil.getVersion()[1] == 19) {
} else if (SpigotUtil.getVersion()[1] == 19 && (setting.isEmpty() || setting.equals("interaction"))) {
renderer = new InteractionVehicleRenderer();
} else {
} else if (setting.equals("armorstand")) {
renderer = new ArmorstandRenderer();
} else {
renderer = new ArmorstandVehicleRenderer();
}
if (HologramRendererCreateEvent.handlers.getRegisteredListeners().length > 0) {
HologramRendererCreateEvent event = new HologramRendererCreateEvent(npc, renderer, true);
@ -429,6 +432,22 @@ public class HologramTrait extends Trait {
}
}
public static class ArmorstandVehicleRenderer extends SingleEntityHologramRenderer {
@Override
protected NPC createNPC(Entity base, String name, Vector3d offset) {
NPC npc = registry().createNPC(EntityType.ARMOR_STAND, name);
npc.getOrAddTrait(ArmorStandTrait.class).setAsHelperEntityWithName(npc);
return npc;
}
@Override
protected void render0(NPC npc, Vector3d offset) {
if (hologram.getEntity().getVehicle() == null) {
NMS.mount(npc.getEntity(), hologram.getEntity());
}
}
}
class HologramLine {
Color backgroundColor = defaultBackgroundColor;
double mb, mt;
@ -875,25 +894,19 @@ public class HologramTrait extends Trait {
}
@Override
public void render0(NPC base, Vector3d offset) {
public void render0(NPC npc, Vector3d offset) {
TextDisplay disp = (TextDisplay) hologram.getEntity();
disp.setInterpolationDelay(0);
disp.setInterpolationDuration(0);
disp.setBillboard(Billboard.CENTER);
Transformation tf = disp.getTransformation();
tf.getTranslation().y = (float) offset.y + 0.35f;
tf.getTranslation().y = (float) offset.y + 0.34f;
disp.setTransformation(tf);
if (color != null) {
disp.setBackgroundColor(color);
} else {
disp.setDefaultBackground(true);
}
if (SUPPORTS_LINE_WIDTH) {
disp.setLineWidth(10000);
}
Messaging.debug(disp.getLineWidth(), disp.getDisplayHeight(), disp.getHeight(), tf.getTranslation());
if (hologram.getEntity().getVehicle() == null) {
NMS.mount(base.getEntity(), hologram.getEntity());
NMS.mount(npc.getEntity(), hologram.getEntity());
}
}
@ -909,16 +922,6 @@ public class HologramTrait extends Trait {
return;
hologram.data().set(NPC.Metadata.TEXT_DISPLAY_COMPONENT, Messaging.minecraftComponentFromRawMessage(text));
}
private static boolean SUPPORTS_LINE_WIDTH = false;
static {
try {
TextDisplay.class.getMethod("setLineWidth", int.class);
SUPPORTS_LINE_WIDTH = true;
} catch (Exception e) {
}
}
}
private static final Pattern ITEM_MATCHER = Pattern.compile("<item:([a-zA-Z0-9_ ]*?)([:].*?)?>");