From 9aaeafac899294a83ed879508264336fcba96a6b Mon Sep 17 00:00:00 2001 From: 7Dev Date: Sun, 21 Dec 2025 19:44:30 -0300 Subject: [PATCH] fancyholograms v3: Introduce Y offset functionality for holograms, including new command support and data handling updates --- .../api/data/BlockHologramData.java | 3 +- .../api/data/DisplayHologramData.java | 3 +- .../fancyholograms/api/data/HologramData.java | 20 +++++- .../api/data/ItemHologramData.java | 3 +- .../api/data/TextHologramData.java | 3 +- .../api/data/BlockHologramData.java | 3 +- .../api/data/DisplayHologramData.java | 3 +- .../fancyholograms/api/data/HologramData.java | 20 +++++- .../api/data/ItemHologramData.java | 3 +- .../api/data/TextHologramData.java | 3 +- .../api/events/HologramUpdateEvent.java | 1 + .../fancyholograms/commands/HologramCMD.java | 4 +- .../commands/hologram/YOffsetCMD.java | 68 +++++++++++++++++++ .../controller/HologramControllerImpl.java | 4 +- .../storage/json/JsonAdapter.java | 10 ++- .../storage/json/model/JsonHologramData.java | 1 + 16 files changed, 137 insertions(+), 15 deletions(-) create mode 100644 plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/commands/hologram/YOffsetCMD.java diff --git a/plugins/fancyholograms-v2/api/src/main/java/de/oliver/fancyholograms/api/data/BlockHologramData.java b/plugins/fancyholograms-v2/api/src/main/java/de/oliver/fancyholograms/api/data/BlockHologramData.java index 70c46b68f..401f4a4db 100644 --- a/plugins/fancyholograms-v2/api/src/main/java/de/oliver/fancyholograms/api/data/BlockHologramData.java +++ b/plugins/fancyholograms-v2/api/src/main/java/de/oliver/fancyholograms/api/data/BlockHologramData.java @@ -65,7 +65,8 @@ public BlockHologramData copy(String name) { .setVisibilityDistance(getVisibilityDistance()) .setVisibility(this.getVisibility()) .setPersistent(this.isPersistent()) - .setLinkedNpcName(getLinkedNpcName()); + .setLinkedNpcName(getLinkedNpcName()) + .setYOffset(this.getYOffset()); return blockHologramData; } diff --git a/plugins/fancyholograms-v2/api/src/main/java/de/oliver/fancyholograms/api/data/DisplayHologramData.java b/plugins/fancyholograms-v2/api/src/main/java/de/oliver/fancyholograms/api/data/DisplayHologramData.java index 5ae62f6cf..6d1eb6b86 100644 --- a/plugins/fancyholograms-v2/api/src/main/java/de/oliver/fancyholograms/api/data/DisplayHologramData.java +++ b/plugins/fancyholograms-v2/api/src/main/java/de/oliver/fancyholograms/api/data/DisplayHologramData.java @@ -204,7 +204,8 @@ public DisplayHologramData copy(String name) { .setVisibilityDistance(this.getVisibilityDistance()) .setVisibility(this.getVisibility()) .setPersistent(this.isPersistent()) - .setLinkedNpcName(this.getLinkedNpcName()); + .setLinkedNpcName(this.getLinkedNpcName()) + .setYOffset(this.getYOffset()); return displayHologramData; } diff --git a/plugins/fancyholograms-v2/api/src/main/java/de/oliver/fancyholograms/api/data/HologramData.java b/plugins/fancyholograms-v2/api/src/main/java/de/oliver/fancyholograms/api/data/HologramData.java index 3c14aa362..45ed3c4d7 100644 --- a/plugins/fancyholograms-v2/api/src/main/java/de/oliver/fancyholograms/api/data/HologramData.java +++ b/plugins/fancyholograms-v2/api/src/main/java/de/oliver/fancyholograms/api/data/HologramData.java @@ -19,6 +19,7 @@ public class HologramData implements YamlData { public static final Visibility DEFAULT_VISIBILITY = Visibility.ALL; public static final boolean DEFAULT_IS_VISIBLE = true; public static final boolean DEFAULT_PERSISTENCE = true; + public static final float DEFAULT_Y_OFFSET = 0.0f; private final String name; private final HologramType type; @@ -28,6 +29,7 @@ public class HologramData implements YamlData { private Visibility visibility = DEFAULT_VISIBILITY; private boolean persistent = DEFAULT_PERSISTENCE; private String linkedNpcName; + private float yOffset = DEFAULT_Y_OFFSET; /** * @param name Name of hologram @@ -134,6 +136,19 @@ public HologramData setLinkedNpcName(String linkedNpcName) { return this; } + public float getYOffset() { + return yOffset; + } + + public HologramData setYOffset(float yOffset) { + if (Float.compare(this.yOffset, yOffset) != 0) { + this.yOffset = yOffset; + setHasChanges(true); + } + + return this; + } + @Override public boolean read(ConfigurationSection section, String name) { String worldName = section.getString("location.world", "world"); @@ -158,6 +173,7 @@ public boolean read(ConfigurationSection section, String name) { return visibleByDefault ? Visibility.ALL : Visibility.PERMISSION_REQUIRED; }); linkedNpcName = section.getString("linkedNpc"); + yOffset = (float) section.getDouble("y_offset", DEFAULT_Y_OFFSET); return true; } @@ -176,6 +192,7 @@ public boolean write(ConfigurationSection section, String name) { section.set("visibility", visibility.name()); section.set("persistent", persistent); section.set("linkedNpc", linkedNpcName); + section.set("y_offset", yOffset); return true; } @@ -185,6 +202,7 @@ public HologramData copy(String name) { .setVisibilityDistance(this.getVisibilityDistance()) .setVisibility(this.getVisibility()) .setPersistent(this.isPersistent()) - .setLinkedNpcName(this.getLinkedNpcName()); + .setLinkedNpcName(this.getLinkedNpcName()) + .setYOffset(this.getYOffset()); } } diff --git a/plugins/fancyholograms-v2/api/src/main/java/de/oliver/fancyholograms/api/data/ItemHologramData.java b/plugins/fancyholograms-v2/api/src/main/java/de/oliver/fancyholograms/api/data/ItemHologramData.java index 5c311e203..f9a5c4f3a 100644 --- a/plugins/fancyholograms-v2/api/src/main/java/de/oliver/fancyholograms/api/data/ItemHologramData.java +++ b/plugins/fancyholograms-v2/api/src/main/java/de/oliver/fancyholograms/api/data/ItemHologramData.java @@ -66,7 +66,8 @@ public ItemHologramData copy(String name) { .setVisibilityDistance(this.getVisibilityDistance()) .setVisibility(this.getVisibility()) .setPersistent(this.isPersistent()) - .setLinkedNpcName(this.getLinkedNpcName()); + .setLinkedNpcName(this.getLinkedNpcName()) + .setYOffset(this.getYOffset()); return itemHologramData; } diff --git a/plugins/fancyholograms-v2/api/src/main/java/de/oliver/fancyholograms/api/data/TextHologramData.java b/plugins/fancyholograms-v2/api/src/main/java/de/oliver/fancyholograms/api/data/TextHologramData.java index 83f64213c..cf66eac7e 100644 --- a/plugins/fancyholograms-v2/api/src/main/java/de/oliver/fancyholograms/api/data/TextHologramData.java +++ b/plugins/fancyholograms-v2/api/src/main/java/de/oliver/fancyholograms/api/data/TextHologramData.java @@ -205,7 +205,8 @@ public TextHologramData copy(String name) { .setVisibilityDistance(this.getVisibilityDistance()) .setVisibility(this.getVisibility()) .setPersistent(this.isPersistent()) - .setLinkedNpcName(this.getLinkedNpcName()); + .setLinkedNpcName(this.getLinkedNpcName()) + .setYOffset(this.getYOffset()); return textHologramData; } diff --git a/plugins/fancyholograms/fh-api/src/main/java/com/fancyinnovations/fancyholograms/api/data/BlockHologramData.java b/plugins/fancyholograms/fh-api/src/main/java/com/fancyinnovations/fancyholograms/api/data/BlockHologramData.java index 5cce75200..7e8d1b48e 100644 --- a/plugins/fancyholograms/fh-api/src/main/java/com/fancyinnovations/fancyholograms/api/data/BlockHologramData.java +++ b/plugins/fancyholograms/fh-api/src/main/java/com/fancyinnovations/fancyholograms/api/data/BlockHologramData.java @@ -68,7 +68,8 @@ public BlockHologramData copy(String name) { .setVisibilityDistance(getVisibilityDistance()) .setVisibility(this.getVisibility()) .setPersistent(this.isPersistent()) - .setLinkedNpcName(getLinkedNpcName()); + .setLinkedNpcName(getLinkedNpcName()) + .setYOffset(this.getYOffset()); return blockHologramData; } diff --git a/plugins/fancyholograms/fh-api/src/main/java/com/fancyinnovations/fancyholograms/api/data/DisplayHologramData.java b/plugins/fancyholograms/fh-api/src/main/java/com/fancyinnovations/fancyholograms/api/data/DisplayHologramData.java index 20d84e511..1cd9e6241 100644 --- a/plugins/fancyholograms/fh-api/src/main/java/com/fancyinnovations/fancyholograms/api/data/DisplayHologramData.java +++ b/plugins/fancyholograms/fh-api/src/main/java/com/fancyinnovations/fancyholograms/api/data/DisplayHologramData.java @@ -231,7 +231,8 @@ public DisplayHologramData copy(String name) { .setVisibilityDistance(this.getVisibilityDistance()) .setVisibility(this.getVisibility()) .setPersistent(this.isPersistent()) - .setLinkedNpcName(this.getLinkedNpcName()); + .setLinkedNpcName(this.getLinkedNpcName()) + .setYOffset(this.getYOffset()); return displayHologramData; } diff --git a/plugins/fancyholograms/fh-api/src/main/java/com/fancyinnovations/fancyholograms/api/data/HologramData.java b/plugins/fancyholograms/fh-api/src/main/java/com/fancyinnovations/fancyholograms/api/data/HologramData.java index fdc662230..7c11afa67 100644 --- a/plugins/fancyholograms/fh-api/src/main/java/com/fancyinnovations/fancyholograms/api/data/HologramData.java +++ b/plugins/fancyholograms/fh-api/src/main/java/com/fancyinnovations/fancyholograms/api/data/HologramData.java @@ -24,6 +24,7 @@ public class HologramData implements YamlData { public static final Visibility DEFAULT_VISIBILITY = Visibility.ALL; public static final boolean DEFAULT_IS_VISIBLE = true; public static final boolean DEFAULT_PERSISTENCE = true; + public static final float DEFAULT_Y_OFFSET = 0.0f; protected final @NotNull HologramTraitTrait traitTrait; private final String name; private final HologramType type; @@ -36,6 +37,7 @@ public class HologramData implements YamlData { private Visibility visibility = DEFAULT_VISIBILITY; private boolean persistent = DEFAULT_PERSISTENCE; private String linkedNpcName; + private float yOffset = DEFAULT_Y_OFFSET; /** * @param name Name of hologram @@ -197,6 +199,19 @@ public HologramData setLinkedNpcName(String linkedNpcName) { return this; } + public float getYOffset() { + return yOffset; + } + + public HologramData setYOffset(float yOffset) { + if (Float.compare(this.yOffset, yOffset) != 0) { + this.yOffset = yOffset; + setHasChanges(true); + } + + return this; + } + @ApiStatus.Experimental public @NotNull HologramTraitTrait getTraitTrait() { return traitTrait; @@ -242,6 +257,7 @@ public boolean read(ConfigurationSection section, String name) { return visibleByDefault ? Visibility.ALL : Visibility.PERMISSION_REQUIRED; }); linkedNpcName = section.getString("linkedNpc"); + yOffset = (float) section.getDouble("y_offset", DEFAULT_Y_OFFSET); return true; } @@ -261,6 +277,7 @@ public boolean write(ConfigurationSection section, String name) { section.set("visibility", visibility.name()); section.set("persistent", persistent); section.set("linkedNpc", linkedNpcName); + section.set("y_offset", yOffset); return true; } @@ -270,6 +287,7 @@ public HologramData copy(String name) { .setVisibilityDistance(this.getVisibilityDistance()) .setVisibility(this.getVisibility()) .setPersistent(this.isPersistent()) - .setLinkedNpcName(this.getLinkedNpcName()); + .setLinkedNpcName(this.getLinkedNpcName()) + .setYOffset(this.getYOffset()); } } diff --git a/plugins/fancyholograms/fh-api/src/main/java/com/fancyinnovations/fancyholograms/api/data/ItemHologramData.java b/plugins/fancyholograms/fh-api/src/main/java/com/fancyinnovations/fancyholograms/api/data/ItemHologramData.java index d50ccbfdd..4058e5b44 100644 --- a/plugins/fancyholograms/fh-api/src/main/java/com/fancyinnovations/fancyholograms/api/data/ItemHologramData.java +++ b/plugins/fancyholograms/fh-api/src/main/java/com/fancyinnovations/fancyholograms/api/data/ItemHologramData.java @@ -69,7 +69,8 @@ public ItemHologramData copy(String name) { .setVisibilityDistance(this.getVisibilityDistance()) .setVisibility(this.getVisibility()) .setPersistent(this.isPersistent()) - .setLinkedNpcName(this.getLinkedNpcName()); + .setLinkedNpcName(this.getLinkedNpcName()) + .setYOffset(this.getYOffset()); return itemHologramData; } diff --git a/plugins/fancyholograms/fh-api/src/main/java/com/fancyinnovations/fancyholograms/api/data/TextHologramData.java b/plugins/fancyholograms/fh-api/src/main/java/com/fancyinnovations/fancyholograms/api/data/TextHologramData.java index 06150ff48..1356784d2 100644 --- a/plugins/fancyholograms/fh-api/src/main/java/com/fancyinnovations/fancyholograms/api/data/TextHologramData.java +++ b/plugins/fancyholograms/fh-api/src/main/java/com/fancyinnovations/fancyholograms/api/data/TextHologramData.java @@ -232,7 +232,8 @@ public TextHologramData copy(String name) { .setVisibilityDistance(this.getVisibilityDistance()) .setVisibility(this.getVisibility()) .setPersistent(this.isPersistent()) - .setLinkedNpcName(this.getLinkedNpcName()); + .setLinkedNpcName(this.getLinkedNpcName()) + .setYOffset(this.getYOffset()); return textHologramData; } diff --git a/plugins/fancyholograms/fh-api/src/main/java/com/fancyinnovations/fancyholograms/api/events/HologramUpdateEvent.java b/plugins/fancyholograms/fh-api/src/main/java/com/fancyinnovations/fancyholograms/api/events/HologramUpdateEvent.java index dab912b92..a24d4403e 100644 --- a/plugins/fancyholograms/fh-api/src/main/java/com/fancyinnovations/fancyholograms/api/events/HologramUpdateEvent.java +++ b/plugins/fancyholograms/fh-api/src/main/java/com/fancyinnovations/fancyholograms/api/events/HologramUpdateEvent.java @@ -74,6 +74,7 @@ public enum HologramModification { POSITION, SCALE, TRANSLATION, + Y_OFFSET, BILLBOARD, BACKGROUND, TEXT_SHADOW, diff --git a/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/commands/HologramCMD.java b/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/commands/HologramCMD.java index a7edc46be..36e5a0d6b 100644 --- a/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/commands/HologramCMD.java +++ b/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/commands/HologramCMD.java @@ -54,6 +54,7 @@ public final class HologramCMD extends Command { <%primary_color%>- /hologram edit textShadow - Enables/disables the text shadow <%primary_color%>- /hologram edit textAlignment - Sets the text alignment <%primary_color%>- /hologram edit seeThrough - Enables/disables whether the text can be seen through blocks + <%primary_color%>- /hologram edit yOffset - Adjusts the NPC y offset <%primary_color%>- /hologram edit shadowRadius - Changes the shadow radius of the hologram <%primary_color%>- /hologram edit shadowStrength - Changes the shadow strength of the hologram <%primary_color%>- /hologram edit brightness <0-15> - Changes the brightness of the hologram @@ -196,7 +197,7 @@ public boolean execute(@NotNull CommandSender sender, @NotNull String label, @No final var usingNpcs = PluginUtils.isFancyNpcsEnabled(); - List suggestions = new ArrayList<>(Arrays.asList("moveDown", "moveUp", "glowing", "traits", "position", "moveHere", "center", "moveTo", "rotate", "rotatepitch", "billboard", "scale", "translate", "visibilityDistance", "visibility", "shadowRadius", "shadowStrength", "brightness", usingNpcs ? "linkWithNpc" : "", usingNpcs ? "unlinkWithNpc" : "")); + List suggestions = new ArrayList<>(Arrays.asList("moveDown", "moveUp", "glowing", "traits", "position", "moveHere", "center", "moveTo", "rotate", "rotatepitch", "billboard", "scale", "translate", "visibilityDistance", "visibility", "yOffset", "shadowRadius", "shadowStrength", "brightness", usingNpcs ? "linkWithNpc" : "", usingNpcs ? "unlinkWithNpc" : "")); suggestions.addAll(type.getCommands()); return suggestions.stream().filter(input -> input.toLowerCase().startsWith(args[2].toLowerCase(Locale.ROOT))).toList(); @@ -374,6 +375,7 @@ private boolean edit(@NotNull final CommandSender player, @NotNull final Hologra case "updatetextinterval" -> new UpdateTextIntervalCMD().run(player, hologram, args); case "visibilitydistance" -> new VisibilityDistanceCMD().run(player, hologram, args); case "visibility" -> new VisibilityCMD().run(player, hologram, args); + case "yoffset" -> new YOffsetCMD().run(player, hologram, args); case "linkwithnpc" -> new LinkWithNpcCMD().run(player, hologram, args); case "shadowradius" -> new ShadowRadiusCMD().run(player, hologram, args); case "shadowstrength" -> new ShadowStrengthCMD().run(player, hologram, args); diff --git a/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/commands/hologram/YOffsetCMD.java b/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/commands/hologram/YOffsetCMD.java new file mode 100644 index 000000000..2e7012d6e --- /dev/null +++ b/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/commands/hologram/YOffsetCMD.java @@ -0,0 +1,68 @@ +package com.fancyinnovations.fancyholograms.commands.hologram; + +import com.google.common.primitives.Floats; +import com.fancyinnovations.fancyholograms.api.events.HologramUpdateEvent; +import com.fancyinnovations.fancyholograms.api.hologram.Hologram; +import com.fancyinnovations.fancyholograms.commands.HologramCMD; +import com.fancyinnovations.fancyholograms.commands.Subcommand; +import com.fancyinnovations.fancyholograms.main.FancyHologramsPlugin; +import de.oliver.fancylib.MessageHelper; +import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class YOffsetCMD implements Subcommand { + + @Override + public List tabcompletion(@NotNull CommandSender player, @Nullable Hologram hologram, @NotNull String[] args) { + return null; + } + + @Override + public boolean run(@NotNull CommandSender player, @Nullable Hologram hologram, @NotNull String[] args) { + if (!(player.hasPermission("fancyholograms.hologram.edit.y_offset"))) { + MessageHelper.error(player, "You don't have the required permission to edit a hologram"); + return false; + } + + final var offset = Floats.tryParse(args[3]); + + if (offset == null) { + MessageHelper.error(player, "Could not parse Y offset"); + return false; + } + + if (Float.compare(offset, hologram.getData().getYOffset()) == 0) { + MessageHelper.warning(player, "This hologram already has this Y offset"); + return false; + } + + final var copied = hologram.getData().copy(hologram.getData().getName()); + copied.setYOffset(offset); + + if (!HologramCMD.callModificationEvent(hologram, player, copied, HologramUpdateEvent.HologramModification.Y_OFFSET)) { + return false; + } + + if (Float.compare(copied.getYOffset(), hologram.getData().getYOffset()) == 0) { + MessageHelper.warning(player, "This hologram already has this Y offset"); + return false; + } + + hologram.getData().setYOffset(copied.getYOffset()); + + if (hologram.getData().getLinkedNpcName() != null) { + FancyHologramsPlugin.get().getControllerImpl().syncHologramWithNpc(hologram); + } + + if (FancyHologramsPlugin.get().getHologramConfiguration().isSaveOnChangedEnabled()) { + FancyHologramsPlugin.get().getStorage().save(hologram.getData()); + } + + MessageHelper.success(player, "Changed Y offset"); + return true; + } +} + diff --git a/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/controller/HologramControllerImpl.java b/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/controller/HologramControllerImpl.java index 9596e320d..d1ca62d9e 100644 --- a/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/controller/HologramControllerImpl.java +++ b/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/controller/HologramControllerImpl.java @@ -198,7 +198,9 @@ public void syncHologramWithNpc(@NotNull final Hologram hologram) { displayData.setScale(new Vector3f(npcScale)); } - Location location = npc.getData().getLocation().clone().add(0, (npc.getEyeHeight() * npcScale) + (0.5 * npcScale), 0); + float yOffset = hologram.getData().getYOffset(); + + Location location = npc.getData().getLocation().clone().add(0, (npc.getEyeHeight() * npcScale) + (0.5 * npcScale) + yOffset, 0); for (Map.Entry entry : npc.getData().getAttributes().entrySet()) { NpcAttribute attribute = entry.getKey(); diff --git a/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/storage/json/JsonAdapter.java b/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/storage/json/JsonAdapter.java index c21142461..332e7d36a 100644 --- a/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/storage/json/JsonAdapter.java +++ b/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/storage/json/JsonAdapter.java @@ -33,6 +33,7 @@ public static JsonHologramData hologramDataToJson(com.fancyinnovations.fancyholo data.getVisibilityDistance(), data.getVisibility(), data.getLinkedNpcName(), + data.getYOffset(), data.getTraitTrait().getTraits().stream() .map(HologramTrait::getName) .toList() @@ -177,7 +178,8 @@ public static com.fancyinnovations.fancyholograms.api.data.HologramData fromJson .setWorldName(data.hologram_data().worldName())// hologram data .setVisibilityDistance(data.hologram_data().visibilityDistance()) .setVisibility(data.hologram_data().visibility()) - .setLinkedNpcName(data.hologram_data().linkedNpcName()); + .setLinkedNpcName(data.hologram_data().linkedNpcName()) + .setYOffset(data.hologram_data().yOffset() == null ? 0f : data.hologram_data().yOffset()); case ITEM -> new com.fancyinnovations.fancyholograms.api.data.ItemHologramData(data.hologram_data().name(), loc) @@ -192,7 +194,8 @@ public static com.fancyinnovations.fancyholograms.api.data.HologramData fromJson .setWorldName(data.hologram_data().worldName())// hologram data .setVisibilityDistance(data.hologram_data().visibilityDistance()) .setVisibility(data.hologram_data().visibility()) - .setLinkedNpcName(data.hologram_data().linkedNpcName()); + .setLinkedNpcName(data.hologram_data().linkedNpcName()) + .setYOffset(data.hologram_data().yOffset() == null ? 0f : data.hologram_data().yOffset()); case BLOCK -> new com.fancyinnovations.fancyholograms.api.data.BlockHologramData(data.hologram_data().name(), loc) .setBlock(Material.getMaterial(data.block_data().block_material())) // block data @@ -206,7 +209,8 @@ public static com.fancyinnovations.fancyholograms.api.data.HologramData fromJson .setWorldName(data.hologram_data().worldName())// hologram data .setVisibilityDistance(data.hologram_data().visibilityDistance()) .setVisibility(data.hologram_data().visibility()) - .setLinkedNpcName(data.hologram_data().linkedNpcName()); + .setLinkedNpcName(data.hologram_data().linkedNpcName()) + .setYOffset(data.hologram_data().yOffset() == null ? 0f : data.hologram_data().yOffset()); }; for (String traitName : data.hologram_data().traits()) { diff --git a/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/storage/json/model/JsonHologramData.java b/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/storage/json/model/JsonHologramData.java index 21845b7c8..4ff5b9016 100644 --- a/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/storage/json/model/JsonHologramData.java +++ b/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/storage/json/model/JsonHologramData.java @@ -13,6 +13,7 @@ public record JsonHologramData( Integer visibilityDistance, Visibility visibility, String linkedNpcName, + Float yOffset, List traits ) { }