From f16b296347b880710cf0c935910c486806968563 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sat, 17 May 2025 21:20:21 +0200 Subject: [PATCH] fancyholograms-v3: Add worldName property --- .../fancyholograms/api/data/HologramData.java | 33 ++++++++++++++++++- .../hologram/version/Hologram1_19_4.java | 2 +- .../hologram/version/Hologram1_20_1.java | 2 +- .../hologram/version/Hologram1_20_2.java | 2 +- .../hologram/version/Hologram1_20_4.java | 2 +- .../commands/hologram/InfoCMD.java | 4 +-- .../commands/hologram/ListCMD.java | 4 +-- .../commands/hologram/NearbyCMD.java | 2 +- .../controller/HologramControllerImpl.java | 5 +-- .../hologram/version/HologramImpl.java | 20 +++++++---- .../storage/YamlHologramStorage.java | 1 + .../storage/json/JsonAdapter.java | 14 +++++--- .../storage/json/model/JsonHologramData.java | 1 + 13 files changed, 68 insertions(+), 24 deletions(-) diff --git a/plugins/fancyholograms/fh-api/src/main/java/de/oliver/fancyholograms/api/data/HologramData.java b/plugins/fancyholograms/fh-api/src/main/java/de/oliver/fancyholograms/api/data/HologramData.java index 610be8bd..5827ce3d 100644 --- a/plugins/fancyholograms/fh-api/src/main/java/de/oliver/fancyholograms/api/data/HologramData.java +++ b/plugins/fancyholograms/fh-api/src/main/java/de/oliver/fancyholograms/api/data/HologramData.java @@ -25,6 +25,7 @@ public class HologramData implements YamlData { private final HologramType type; private String filePath; private Location location; + private String worldName; private boolean hasChanges = false; private int visibilityDistance = DEFAULT_VISIBILITY_DISTANCE; private Visibility visibility = DEFAULT_VISIBILITY; @@ -41,6 +42,11 @@ public class HologramData implements YamlData { this.name = name; this.type = type; this.location = location; + if (location != null && location.getWorld() != null) { + this.worldName = location.getWorld().getName(); + } else { + this.worldName = null; + } } public @NotNull String getName() { @@ -66,7 +72,32 @@ public class HologramData implements YamlData { } public HologramData setLocation(@Nullable Location location) { - this.location = location != null ? location.clone() : null; + if (location == null) { + this.location = null; + this.worldName = null; + } else { + this.location = location.clone(); + if (this.location.getWorld() == null) { + this.worldName = null; + } + } + + setHasChanges(true); + return this; + } + + public String getWorldName() { + return worldName; + } + + public HologramData setWorldName(String worldName) { + this.worldName = worldName; + if (this.location != null) { + World world = Bukkit.getWorld(worldName); + if (world != null) { + this.location.setWorld(world); + } + } setHasChanges(true); return this; } diff --git a/plugins/fancyholograms/implementation_1_19_4/src/main/java/de/oliver/fancyholograms/hologram/version/Hologram1_19_4.java b/plugins/fancyholograms/implementation_1_19_4/src/main/java/de/oliver/fancyholograms/hologram/version/Hologram1_19_4.java index 2179fba4..1f7d1089 100644 --- a/plugins/fancyholograms/implementation_1_19_4/src/main/java/de/oliver/fancyholograms/hologram/version/Hologram1_19_4.java +++ b/plugins/fancyholograms/implementation_1_19_4/src/main/java/de/oliver/fancyholograms/hologram/version/Hologram1_19_4.java @@ -185,7 +185,7 @@ public final class Hologram1_19_4 extends Hologram { return; // could not be created, nothing to show } - if (!data.getLocation().getWorld().getName().equals(player.getLocation().getWorld().getName())) { + if (!data.getWorldName().equals(player.getLocation().getWorld().getName())) { return; } diff --git a/plugins/fancyholograms/implementation_1_20_1/src/main/java/de/oliver/fancyholograms/hologram/version/Hologram1_20_1.java b/plugins/fancyholograms/implementation_1_20_1/src/main/java/de/oliver/fancyholograms/hologram/version/Hologram1_20_1.java index 19fb5467..7f86efe1 100644 --- a/plugins/fancyholograms/implementation_1_20_1/src/main/java/de/oliver/fancyholograms/hologram/version/Hologram1_20_1.java +++ b/plugins/fancyholograms/implementation_1_20_1/src/main/java/de/oliver/fancyholograms/hologram/version/Hologram1_20_1.java @@ -185,7 +185,7 @@ public final class Hologram1_20_1 extends Hologram { return; // could not be created, nothing to show } - if (!data.getLocation().getWorld().getName().equals(player.getLocation().getWorld().getName())) { + if (!data.getWorldName().equals(player.getLocation().getWorld().getName())) { return; } diff --git a/plugins/fancyholograms/implementation_1_20_2/src/main/java/de/oliver/fancyholograms/hologram/version/Hologram1_20_2.java b/plugins/fancyholograms/implementation_1_20_2/src/main/java/de/oliver/fancyholograms/hologram/version/Hologram1_20_2.java index e04b5ce5..6f0765b4 100644 --- a/plugins/fancyholograms/implementation_1_20_2/src/main/java/de/oliver/fancyholograms/hologram/version/Hologram1_20_2.java +++ b/plugins/fancyholograms/implementation_1_20_2/src/main/java/de/oliver/fancyholograms/hologram/version/Hologram1_20_2.java @@ -185,7 +185,7 @@ public final class Hologram1_20_2 extends Hologram { return; // could not be created, nothing to show } - if (!data.getLocation().getWorld().getName().equals(player.getLocation().getWorld().getName())) { + if (!data.getWorldName().equals(player.getLocation().getWorld().getName())) { return; } diff --git a/plugins/fancyholograms/implementation_1_20_4/src/main/java/de/oliver/fancyholograms/hologram/version/Hologram1_20_4.java b/plugins/fancyholograms/implementation_1_20_4/src/main/java/de/oliver/fancyholograms/hologram/version/Hologram1_20_4.java index 1383fac3..1912e232 100644 --- a/plugins/fancyholograms/implementation_1_20_4/src/main/java/de/oliver/fancyholograms/hologram/version/Hologram1_20_4.java +++ b/plugins/fancyholograms/implementation_1_20_4/src/main/java/de/oliver/fancyholograms/hologram/version/Hologram1_20_4.java @@ -185,7 +185,7 @@ public final class Hologram1_20_4 extends Hologram { return; // could not be created, nothing to show } - if (!data.getLocation().getWorld().getName().equals(player.getLocation().getWorld().getName())) { + if (!data.getWorldName().equals(player.getLocation().getWorld().getName())) { return; } diff --git a/plugins/fancyholograms/src/main/java/de/oliver/fancyholograms/commands/hologram/InfoCMD.java b/plugins/fancyholograms/src/main/java/de/oliver/fancyholograms/commands/hologram/InfoCMD.java index d147cce8..0c73ea8b 100644 --- a/plugins/fancyholograms/src/main/java/de/oliver/fancyholograms/commands/hologram/InfoCMD.java +++ b/plugins/fancyholograms/src/main/java/de/oliver/fancyholograms/commands/hologram/InfoCMD.java @@ -1,7 +1,7 @@ package de.oliver.fancyholograms.commands.hologram; -import de.oliver.fancyholograms.api.hologram.Hologram; import de.oliver.fancyholograms.api.data.*; +import de.oliver.fancyholograms.api.hologram.Hologram; import de.oliver.fancyholograms.commands.Subcommand; import de.oliver.fancylib.MessageHelper; import org.bukkit.command.CommandSender; @@ -31,7 +31,7 @@ public class InfoCMD implements Subcommand { MessageHelper.info(player, "Information about the " + hologram.getData().getName() + " hologram:"); MessageHelper.info(player, "Name: " + hologram.getData().getName()); MessageHelper.info(player, "Type: " + hologram.getData().getType().name()); - MessageHelper.info(player, "Location: " + data.getLocation().getWorld().getName() + " " + data.getLocation().getX() + " / " + data.getLocation().getY() + " / " + data.getLocation().getZ()); + MessageHelper.info(player, "Location: " + data.getWorldName() + " " + data.getLocation().getX() + " / " + data.getLocation().getY() + " / " + data.getLocation().getZ()); MessageHelper.info(player, "Visibility distance: " + data.getVisibilityDistance() + " blocks"); if (data instanceof DisplayHologramData displayData) { diff --git a/plugins/fancyholograms/src/main/java/de/oliver/fancyholograms/commands/hologram/ListCMD.java b/plugins/fancyholograms/src/main/java/de/oliver/fancyholograms/commands/hologram/ListCMD.java index 16a62a58..dc1ff4e4 100644 --- a/plugins/fancyholograms/src/main/java/de/oliver/fancyholograms/commands/hologram/ListCMD.java +++ b/plugins/fancyholograms/src/main/java/de/oliver/fancyholograms/commands/hologram/ListCMD.java @@ -56,7 +56,7 @@ public class ListCMD implements Subcommand { .limit(10) .forEach(holo -> { final var location = holo.getData().getLocation(); - if (location == null || location.getWorld() == null) { + if (location == null || holo.getData().getWorldName() == null) { return; } @@ -67,7 +67,7 @@ public class ListCMD implements Subcommand { Formats.DECIMAL.format(location.x()), Formats.DECIMAL.format(location.y()), Formats.DECIMAL.format(location.z()), - location.getWorld().getName() + holo.getData().getWorldName() )); }); diff --git a/plugins/fancyholograms/src/main/java/de/oliver/fancyholograms/commands/hologram/NearbyCMD.java b/plugins/fancyholograms/src/main/java/de/oliver/fancyholograms/commands/hologram/NearbyCMD.java index 3fcd2b60..10ac8598 100644 --- a/plugins/fancyholograms/src/main/java/de/oliver/fancyholograms/commands/hologram/NearbyCMD.java +++ b/plugins/fancyholograms/src/main/java/de/oliver/fancyholograms/commands/hologram/NearbyCMD.java @@ -58,7 +58,7 @@ public class NearbyCMD implements Subcommand { .getRegistry() .getAllPersistent() .stream() - .filter((holo) -> holo.getData().getLocation().getWorld() == playerLocation.getWorld()) + .filter((holo) -> holo.getData().getWorldName().equals(playerLocation.getWorld().getName())) .map((holo) -> Map.entry(holo, holo.getData().getLocation().distance(playerLocation))) .filter((entry) -> entry.getValue() <= range.get()) .sorted(Comparator.comparingInt(a -> a.getValue().intValue())) diff --git a/plugins/fancyholograms/src/main/java/de/oliver/fancyholograms/controller/HologramControllerImpl.java b/plugins/fancyholograms/src/main/java/de/oliver/fancyholograms/controller/HologramControllerImpl.java index 540c97e0..73cd5bb8 100644 --- a/plugins/fancyholograms/src/main/java/de/oliver/fancyholograms/controller/HologramControllerImpl.java +++ b/plugins/fancyholograms/src/main/java/de/oliver/fancyholograms/controller/HologramControllerImpl.java @@ -9,6 +9,7 @@ import de.oliver.fancyholograms.api.hologram.Hologram; import de.oliver.fancyholograms.main.FancyHologramsPlugin; import de.oliver.fancynpcs.api.FancyNpcsPlugin; import org.bukkit.Bukkit; +import org.bukkit.Location; import org.bukkit.entity.Player; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; @@ -82,8 +83,8 @@ public class HologramControllerImpl implements HologramController { } private boolean isWithinVisibilityDistance(@NotNull final Hologram hologram, @NotNull final Player player) { - final var location = hologram.getData().getLocation(); - if (!location.getWorld().equals(player.getWorld())) { + final Location location = hologram.getData().getLocation(); + if (!hologram.getData().getWorldName().equals(player.getWorld().getName())) { return false; } diff --git a/plugins/fancyholograms/src/main/java/de/oliver/fancyholograms/hologram/version/HologramImpl.java b/plugins/fancyholograms/src/main/java/de/oliver/fancyholograms/hologram/version/HologramImpl.java index 7526765b..dcb357f3 100644 --- a/plugins/fancyholograms/src/main/java/de/oliver/fancyholograms/hologram/version/HologramImpl.java +++ b/plugins/fancyholograms/src/main/java/de/oliver/fancyholograms/hologram/version/HologramImpl.java @@ -44,7 +44,8 @@ public final class HologramImpl extends Hologram { return; // could not be created, nothing to show } - if (!data.getLocation().getWorld().getName().equals(player.getLocation().getWorld().getName())) { + // this implies that the world is loaded + if (!data.getWorldName().equals(player.getLocation().getWorld().getName())) { return; } @@ -67,12 +68,16 @@ public final class HologramImpl extends Hologram { @Override public void despawnFrom(@NotNull final Player player) { - if (!new HologramDespawnEvent(this, player).callEvent()) { + if (fsDisplay == null) { + return; // doesn't exist, nothing to hide + } + + if (!data.getWorldName().equals(player.getLocation().getWorld().getName())) { return; } - if (fsDisplay == null) { - return; // doesn't exist, nothing to hide + if (!new HologramDespawnEvent(this, player).callEvent()) { + return; } FS_RealPlayer fsPlayer = new FS_RealPlayer(player); @@ -90,6 +95,10 @@ public final class HologramImpl extends Hologram { return; // doesn't exist, nothing to refresh } + if (!data.getWorldName().equals(player.getLocation().getWorld().getName())) { + return; + } + syncWithData(); if (!isViewer(player)) { @@ -123,9 +132,6 @@ public final class HologramImpl extends Hologram { // location data final var location = data.getLocation(); - if (location.getWorld() == null || !location.isWorldLoaded()) { - return; - } fsDisplay.setLocation(location); if (fsDisplay instanceof FS_TextDisplay textDisplay && data instanceof TextHologramData textData) { diff --git a/plugins/fancyholograms/src/main/java/de/oliver/fancyholograms/storage/YamlHologramStorage.java b/plugins/fancyholograms/src/main/java/de/oliver/fancyholograms/storage/YamlHologramStorage.java index f66d6c99..b3d464c9 100644 --- a/plugins/fancyholograms/src/main/java/de/oliver/fancyholograms/storage/YamlHologramStorage.java +++ b/plugins/fancyholograms/src/main/java/de/oliver/fancyholograms/storage/YamlHologramStorage.java @@ -150,6 +150,7 @@ public class YamlHologramStorage implements HologramStorage { case ITEM -> displayData = new ItemHologramData(name, new Location(null, 0, 0, 0)); case BLOCK -> displayData = new BlockHologramData(name, new Location(null, 0, 0, 0)); } + displayData.setWorldName(holoSection.getString("location.world")); if (!displayData.read(holoSection, name)) { FancyHologramsPlugin.get().getFancyLogger().warn("Could not read hologram data - skipping hologram"); diff --git a/plugins/fancyholograms/src/main/java/de/oliver/fancyholograms/storage/json/JsonAdapter.java b/plugins/fancyholograms/src/main/java/de/oliver/fancyholograms/storage/json/JsonAdapter.java index 45c1d86c..c6979095 100644 --- a/plugins/fancyholograms/src/main/java/de/oliver/fancyholograms/storage/json/JsonAdapter.java +++ b/plugins/fancyholograms/src/main/java/de/oliver/fancyholograms/storage/json/JsonAdapter.java @@ -16,13 +16,14 @@ public class JsonAdapter { data.getName(), data.getType(), new JsonLocation( - data.getLocation().getWorld().getName(), + data.getWorldName(), data.getLocation().getX(), data.getLocation().getY(), data.getLocation().getZ(), data.getLocation().getYaw(), data.getLocation().getPitch() ), + data.getWorldName(), data.getVisibilityDistance(), data.getVisibility(), data.getLinkedNpcName() @@ -118,7 +119,7 @@ public class JsonAdapter { public static HologramData fromJson(JsonDataUnion data) { Location loc = new Location( - Bukkit.getWorld(data.hologram_data().location().world()), + Bukkit.getWorld(data.hologram_data().worldName()), data.hologram_data().location().x(), data.hologram_data().location().y(), data.hologram_data().location().z() @@ -156,7 +157,8 @@ public class JsonAdapter { .setBrightness(brightness) .setShadowRadius(data.display_data().shadow_radius()) .setShadowStrength(data.display_data().shadow_strength()) - .setVisibilityDistance(data.hologram_data().visibilityDistance()) // hologram data + .setWorldName(data.hologram_data().worldName())// hologram data + .setVisibilityDistance(data.hologram_data().visibilityDistance()) .setVisibility(data.hologram_data().visibility()) .setLinkedNpcName(data.hologram_data().linkedNpcName()); @@ -168,7 +170,8 @@ public class JsonAdapter { .setBrightness(brightness) .setShadowRadius(data.display_data().shadow_radius()) .setShadowStrength(data.display_data().shadow_strength()) - .setVisibilityDistance(data.hologram_data().visibilityDistance()) // hologram data + .setWorldName(data.hologram_data().worldName())// hologram data + .setVisibilityDistance(data.hologram_data().visibilityDistance()) .setVisibility(data.hologram_data().visibility()) .setLinkedNpcName(data.hologram_data().linkedNpcName()); case BLOCK -> new BlockHologramData(data.hologram_data().name(), loc) @@ -179,7 +182,8 @@ public class JsonAdapter { .setBrightness(brightness) .setShadowRadius(data.display_data().shadow_radius()) .setShadowStrength(data.display_data().shadow_strength()) - .setVisibilityDistance(data.hologram_data().visibilityDistance()) // hologram data + .setWorldName(data.hologram_data().worldName())// hologram data + .setVisibilityDistance(data.hologram_data().visibilityDistance()) .setVisibility(data.hologram_data().visibility()) .setLinkedNpcName(data.hologram_data().linkedNpcName()); }; diff --git a/plugins/fancyholograms/src/main/java/de/oliver/fancyholograms/storage/json/model/JsonHologramData.java b/plugins/fancyholograms/src/main/java/de/oliver/fancyholograms/storage/json/model/JsonHologramData.java index 7d26109a..c54e0dc4 100644 --- a/plugins/fancyholograms/src/main/java/de/oliver/fancyholograms/storage/json/model/JsonHologramData.java +++ b/plugins/fancyholograms/src/main/java/de/oliver/fancyholograms/storage/json/model/JsonHologramData.java @@ -7,6 +7,7 @@ public record JsonHologramData( String name, HologramType type, JsonLocation location, + String worldName, Integer visibilityDistance, Visibility visibility, String linkedNpcName