diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/TextDisplayEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/TextDisplayEntity.java index 8b47ce1ed..0cd207c52 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/TextDisplayEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/TextDisplayEntity.java @@ -25,18 +25,25 @@ package org.geysermc.geyser.entity.type; +import lombok.Getter; import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes; import org.geysermc.geyser.entity.EntityDefinition; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.text.MessageTranslator; import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.EntityMetadata; +import org.jetbrains.annotations.Nullable; import java.util.UUID; // Note: 1.19.4 requires that the billboard is set to something in order to show, on Java Edition +@Getter public class TextDisplayEntity extends DisplayBaseEntity { + + private int lineCount; + public TextDisplayEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, EntityDefinition definition, Vector3f position, Vector3f motion, float yaw, float pitch, float headYaw) { super(session, entityId, geyserId, uuid, definition, position.add(0, definition.offset(), 0), motion, yaw, pitch, headYaw); } @@ -61,5 +68,14 @@ public class TextDisplayEntity extends DisplayBaseEntity { public void setText(EntityMetadata entityMetadata) { this.dirtyMetadata.put(EntityDataTypes.NAME, MessageTranslator.convertMessage(entityMetadata.getValue())); + calculateLineCount(entityMetadata.getValue()); + } + + private void calculateLineCount(@Nullable Component text) { + if (text == null) { + lineCount = 0; + return; + } + lineCount = PlainTextComponentSerializer.plainText().serialize(text).split("\n").length; } } diff --git a/core/src/main/java/org/geysermc/geyser/util/EntityUtils.java b/core/src/main/java/org/geysermc/geyser/util/EntityUtils.java index 034975b15..388162a49 100644 --- a/core/src/main/java/org/geysermc/geyser/util/EntityUtils.java +++ b/core/src/main/java/org/geysermc/geyser/util/EntityUtils.java @@ -209,6 +209,18 @@ public final class EntityUtils { zOffset = displayTranslation.getZ(); } } + case PLAYER -> { + if (passenger instanceof TextDisplayEntity textDisplay) { + Vector3f displayTranslation = textDisplay.getTranslation(); + int lines = textDisplay.getLineCount(); + if (displayTranslation != null && lines != 0) { + float multiplier = .1414f; + xOffset = displayTranslation.getX(); + yOffset += displayTranslation.getY() + multiplier * lines; + zOffset = displayTranslation.getZ(); + } + } + } } if (mount instanceof ChestBoatEntity) { xOffset = 0.15F;