From 7f41e1978b88e9635718cfa731975dacc659a844 Mon Sep 17 00:00:00 2001 From: Oliver Date: Wed, 30 Jul 2025 19:08:25 +0200 Subject: [PATCH] fancyholograms v3: Fix trait_trait trait saving and loading --- .../fancyholograms/api/data/HologramData.java | 32 +++++++- .../fancyholograms/api/hologram/Hologram.java | 38 +--------- .../api/trait/HologramTrait.java | 6 +- .../api/trait/HologramTraitTrait.java | 73 ++++--------------- .../controller/HologramControllerImpl.java | 6 +- .../fancyholograms/hologram/HologramImpl.java | 8 +- .../registry/HologramRegistryImpl.java | 4 +- .../storage/json/JsonAdapter.java | 24 +++++- .../storage/json/model/JsonHologramData.java | 5 +- 9 files changed, 87 insertions(+), 109 deletions(-) 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 9969856c..2476777f 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 @@ -3,6 +3,8 @@ package com.fancyinnovations.fancyholograms.api.data; import com.fancyinnovations.fancyholograms.api.FancyHolograms; import com.fancyinnovations.fancyholograms.api.data.property.Visibility; import com.fancyinnovations.fancyholograms.api.hologram.HologramType; +import com.fancyinnovations.fancyholograms.api.trait.HologramTrait; +import com.fancyinnovations.fancyholograms.api.trait.HologramTraitTrait; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; @@ -11,6 +13,7 @@ import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.lang.reflect.InvocationTargetException; import java.util.Objects; import java.util.Optional; @@ -20,7 +23,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; - + protected final @NotNull HologramTraitTrait traitTrait; private final String name; private final HologramType type; private String filePath; @@ -48,6 +51,7 @@ public class HologramData implements YamlData { } else { this.worldName = null; } + this.traitTrait = new HologramTraitTrait(); } public @NotNull String getName() { @@ -192,6 +196,32 @@ public class HologramData implements YamlData { return this; } + @ApiStatus.Experimental + public @NotNull HologramTraitTrait getTraitTrait() { + return traitTrait; + } + + @ApiStatus.Experimental + public HologramData addTrait(HologramTrait trait) { + traitTrait.addTrait(trait); + return this; + } + + @ApiStatus.Experimental + public HologramData addTrait(Class traitClass) { + HologramTrait trait = null; + try { + trait = traitClass.getConstructor(null).newInstance(); + } catch (InstantiationException | IllegalAccessException | InvocationTargetException | + NoSuchMethodException e) { + FancyHolograms.get().getFancyLogger().error("Failed to instantiate trait " + traitClass.getSimpleName()); + FancyHolograms.get().getFancyLogger().error(e); + } + + traitTrait.addTrait(trait); + return this; + } + @Override @ApiStatus.Internal public boolean read(ConfigurationSection section, String name) { diff --git a/plugins/fancyholograms/fh-api/src/main/java/com/fancyinnovations/fancyholograms/api/hologram/Hologram.java b/plugins/fancyholograms/fh-api/src/main/java/com/fancyinnovations/fancyholograms/api/hologram/Hologram.java index 327baae6..320b7d8a 100644 --- a/plugins/fancyholograms/fh-api/src/main/java/com/fancyinnovations/fancyholograms/api/hologram/Hologram.java +++ b/plugins/fancyholograms/fh-api/src/main/java/com/fancyinnovations/fancyholograms/api/hologram/Hologram.java @@ -1,11 +1,8 @@ package com.fancyinnovations.fancyholograms.api.hologram; -import com.google.common.collect.Sets; -import com.fancyinnovations.fancyholograms.api.FancyHolograms; import com.fancyinnovations.fancyholograms.api.data.HologramData; import com.fancyinnovations.fancyholograms.api.data.TextHologramData; -import com.fancyinnovations.fancyholograms.api.trait.HologramTrait; -import com.fancyinnovations.fancyholograms.api.trait.HologramTraitTrait; +import com.google.common.collect.Sets; import net.kyori.adventure.text.Component; import org.bukkit.Color; import org.bukkit.entity.Player; @@ -14,7 +11,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.lushplugins.chatcolorhandler.ModernChatColorHandler; -import java.lang.reflect.InvocationTargetException; import java.util.HashSet; import java.util.Set; import java.util.UUID; @@ -32,13 +28,13 @@ public abstract class Hologram { protected final @NotNull HologramData data; protected final @NotNull Set viewers; - protected final @NotNull HologramTraitTrait traitTrait; protected Hologram(@NotNull final HologramData data) { this.data = data; this.viewers = new HashSet<>(); - this.traitTrait = new HologramTraitTrait(this); - this.data.setOnModify(this.traitTrait::onModify); + + this.data.getTraitTrait().attachHologram(this); + this.data.setOnModify(this.data.getTraitTrait()::onModify); } /** @@ -100,32 +96,6 @@ public abstract class Hologram { return this.viewers.contains(player); } - @ApiStatus.Experimental - public @NotNull HologramTraitTrait getTraitTrait() { - return traitTrait; - } - - @ApiStatus.Experimental - public HologramData addTrait(HologramTrait trait) { - traitTrait.addTrait(trait); - return data; - } - - @ApiStatus.Experimental - public HologramData addTrait(Class traitClass) { - HologramTrait trait = null; - try { - trait = traitClass.getConstructor(null).newInstance(); - } catch (InstantiationException | IllegalAccessException | InvocationTargetException | - NoSuchMethodException e) { - FancyHolograms.get().getFancyLogger().error("Failed to instantiate trait " + traitClass.getSimpleName()); - FancyHolograms.get().getFancyLogger().error(e); - } - - traitTrait.addTrait(trait); - return data; - } - public final @NotNull HologramData getData() { return this.data; } diff --git a/plugins/fancyholograms/fh-api/src/main/java/com/fancyinnovations/fancyholograms/api/trait/HologramTrait.java b/plugins/fancyholograms/fh-api/src/main/java/com/fancyinnovations/fancyholograms/api/trait/HologramTrait.java index bcbc13d0..de60f7b3 100644 --- a/plugins/fancyholograms/fh-api/src/main/java/com/fancyinnovations/fancyholograms/api/trait/HologramTrait.java +++ b/plugins/fancyholograms/fh-api/src/main/java/com/fancyinnovations/fancyholograms/api/trait/HologramTrait.java @@ -1,10 +1,10 @@ package com.fancyinnovations.fancyholograms.api.trait; -import de.oliver.fancyanalytics.logger.ExtendedFancyLogger; import com.fancyinnovations.fancyholograms.api.FancyHolograms; import com.fancyinnovations.fancyholograms.api.HologramController; import com.fancyinnovations.fancyholograms.api.HologramRegistry; import com.fancyinnovations.fancyholograms.api.hologram.Hologram; +import de.oliver.fancyanalytics.logger.ExtendedFancyLogger; import de.oliver.jdb.JDB; import org.bukkit.entity.Player; import org.jetbrains.annotations.ApiStatus; @@ -108,7 +108,7 @@ public abstract class HologramTrait { } protected final boolean isTraitAttached(Class trait) { - for (HologramTrait hologramTrait : hologram.getTraitTrait().getTraits()) { + for (HologramTrait hologramTrait : hologram.getData().getTraitTrait().getTraits()) { if (hologramTrait.getClass().equals(trait)) { return true; } @@ -118,7 +118,7 @@ public abstract class HologramTrait { } protected final T getTrait(Class trait) { - for (HologramTrait hologramTrait : hologram.getTraitTrait().getTraits()) { + for (HologramTrait hologramTrait : hologram.getData().getTraitTrait().getTraits()) { if (hologramTrait.getClass().equals(trait)) { return (T) hologramTrait; } diff --git a/plugins/fancyholograms/fh-api/src/main/java/com/fancyinnovations/fancyholograms/api/trait/HologramTraitTrait.java b/plugins/fancyholograms/fh-api/src/main/java/com/fancyinnovations/fancyholograms/api/trait/HologramTraitTrait.java index ceeb550f..1cf14737 100644 --- a/plugins/fancyholograms/fh-api/src/main/java/com/fancyinnovations/fancyholograms/api/trait/HologramTraitTrait.java +++ b/plugins/fancyholograms/fh-api/src/main/java/com/fancyinnovations/fancyholograms/api/trait/HologramTraitTrait.java @@ -1,10 +1,8 @@ package com.fancyinnovations.fancyholograms.api.trait; import com.fancyinnovations.fancyholograms.api.events.HologramTraitAttachedEvent; -import com.fancyinnovations.fancyholograms.api.hologram.Hologram; import org.bukkit.entity.Player; -import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -12,27 +10,21 @@ import java.util.List; public class HologramTraitTrait extends HologramTrait { private final List traits; - private Configuration configuration; - public HologramTraitTrait(Hologram hologram) { - this.configuration = new Configuration(new ArrayList<>()); + public HologramTraitTrait() { this.traits = new ArrayList<>(); - attachHologram(hologram); } public void addTrait(HologramTrait trait) { - if (!new HologramTraitAttachedEvent(hologram, trait, false).callEvent()) { - return; - } - - trait.attachHologram(hologram); this.traits.add(trait); - this.configuration.traits().add(trait.getName()); - try { - storage.set(hologram.getData().getName(), configuration); - } catch (IOException e) { - logger.error("Failed to save configuration for HologramTraitTrait"); - logger.error(e); + + // Attach the trait to the hologram if hologram already exists + if (hologram != null) { + if (!new HologramTraitAttachedEvent(hologram, trait, false).callEvent()) { + return; + } + + trait.attachHologram(hologram); } } @@ -47,11 +39,6 @@ public class HologramTraitTrait extends HologramTrait { try { HologramTrait trait = ti.clazz().getConstructor().newInstance(); - if (!new HologramTraitAttachedEvent(hologram, trait, true).callEvent()) { - continue; - } - - trait.attachHologram(hologram); this.traits.add(trait); } catch (Exception e) { logger.error("Failed to instantiate default trait " + ti.name()); @@ -61,38 +48,13 @@ public class HologramTraitTrait extends HologramTrait { logger.debug("Attached default trait " + ti.name() + " to hologram " + hologram.getData().getName()); } - // Attach all traits that are already attached to the hologram - try { - configuration = storage.get(hologram.getData().getName(), Configuration.class); - } catch (IOException e) { - logger.error("Failed to load configuration for HologramTraitTrait"); - logger.error(e); - return; - } - if (configuration == null) { - return; - } - - for (String traitName : configuration.traits()) { - HologramTraitRegistry.TraitInfo traitInfo = api.getTraitRegistry().getTrait(traitName); - if (traitInfo == null) { - logger.warn("Trait " + traitName + " is not registered"); + // Attach all traits that were added to the hologram + for (HologramTrait trait : traits) { + if (!new HologramTraitAttachedEvent(hologram, trait, false).callEvent()) { continue; } - try { - HologramTrait trait = traitInfo.clazz().getConstructor().newInstance(); - - if (!new HologramTraitAttachedEvent(hologram, trait, false).callEvent()) { - return; - } - - trait.attachHologram(hologram); - this.traits.add(trait); - } catch (Exception e) { - logger.error("Failed to instantiate trait " + traitName); - logger.error(e); - } + trait.attachHologram(hologram); } } @@ -156,13 +118,4 @@ public class HologramTraitTrait extends HologramTrait { return traits; } - public Configuration getConfiguration() { - return configuration; - } - - public record Configuration( - List traits - ) { - - } } 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 b5c99450..f9669e76 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 @@ -34,7 +34,7 @@ public class HologramControllerImpl implements HologramController { } hologram.spawnTo(player); - hologram.getTraitTrait().onSpawn(player); + hologram.getData().getTraitTrait().onSpawn(player); } } @@ -49,7 +49,7 @@ public class HologramControllerImpl implements HologramController { } hologram.despawnFrom(player); - hologram.getTraitTrait().onDespawn(player); + hologram.getData().getTraitTrait().onDespawn(player); } } @@ -65,7 +65,7 @@ public class HologramControllerImpl implements HologramController { } hologram.updateFor(player); - hologram.getTraitTrait().onUpdate(player); + hologram.getData().getTraitTrait().onUpdate(player); } } diff --git a/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/hologram/HologramImpl.java b/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/hologram/HologramImpl.java index ebfa446f..2774f722 100644 --- a/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/hologram/HologramImpl.java +++ b/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/hologram/HologramImpl.java @@ -1,13 +1,13 @@ package com.fancyinnovations.fancyholograms.hologram; -import com.fancyinnovations.fancyholograms.api.data.HologramData; -import com.viaversion.viaversion.api.Via; import com.fancyinnovations.fancyholograms.api.FancyHolograms; +import com.fancyinnovations.fancyholograms.api.data.HologramData; import com.fancyinnovations.fancyholograms.api.events.HologramDespawnEvent; import com.fancyinnovations.fancyholograms.api.events.HologramSpawnEvent; import com.fancyinnovations.fancyholograms.api.hologram.Hologram; import com.fancyinnovations.fancyholograms.main.FancyHologramsPlugin; import com.fancyinnovations.fancyholograms.util.PluginUtils; +import com.viaversion.viaversion.api.Via; import de.oliver.fancysitula.api.entities.*; import de.oliver.fancysitula.factories.FancySitula; import org.bukkit.entity.Player; @@ -63,7 +63,7 @@ public final class HologramImpl extends Hologram { this.viewers.add(player.getUniqueId()); updateFor(player); - traitTrait.onSpawn(player); + data.getTraitTrait().onSpawn(player); } @Override @@ -85,7 +85,7 @@ public final class HologramImpl extends Hologram { this.viewers.remove(player.getUniqueId()); - traitTrait.onDespawn(player); + data.getTraitTrait().onDespawn(player); } diff --git a/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/registry/HologramRegistryImpl.java b/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/registry/HologramRegistryImpl.java index e5db5c71..63279ede 100644 --- a/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/registry/HologramRegistryImpl.java +++ b/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/registry/HologramRegistryImpl.java @@ -26,7 +26,7 @@ public class HologramRegistryImpl implements HologramRegistry { boolean registered = holograms.putIfAbsent(hologram.getData().getName(), hologram) != null; - hologram.getTraitTrait().onRegister(); + hologram.getData().getTraitTrait().onRegister(); return registered; } @@ -41,7 +41,7 @@ public class HologramRegistryImpl implements HologramRegistry { FancyHologramsPlugin.get().getStorage().delete(hologram.getData()); - hologram.getTraitTrait().onUnregister(); + hologram.getData().getTraitTrait().onUnregister(); return removed; } 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 6cb18999..fcb7264a 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 @@ -1,6 +1,9 @@ package com.fancyinnovations.fancyholograms.storage.json; +import com.fancyinnovations.fancyholograms.api.FancyHolograms; import com.fancyinnovations.fancyholograms.api.data.HologramData; +import com.fancyinnovations.fancyholograms.api.trait.HologramTrait; +import com.fancyinnovations.fancyholograms.api.trait.HologramTraitRegistry; import com.fancyinnovations.fancyholograms.storage.json.model.*; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -26,7 +29,10 @@ public class JsonAdapter { data.getWorldName(), data.getVisibilityDistance(), data.getVisibility(), - data.getLinkedNpcName() + data.getLinkedNpcName(), + data.getTraitTrait().getTraits().stream() + .map(HologramTrait::getName) + .toList() ); } @@ -197,6 +203,22 @@ public class JsonAdapter { .setLinkedNpcName(data.hologram_data().linkedNpcName()); }; + for (String traitName : data.hologram_data().traits()) { + HologramTraitRegistry.TraitInfo traitInfo = FancyHolograms.get().getTraitRegistry().getTrait(traitName); + if (traitInfo == null) { + FancyHolograms.get().getFancyLogger().warn("Trait " + traitName + " is not registered"); + continue; + } + + try { + HologramTrait trait = traitInfo.clazz().getConstructor().newInstance(); + hologramData.getTraitTrait().addTrait(trait); + } catch (Exception e) { + FancyHolograms.get().getFancyLogger().error("Failed to instantiate trait " + traitName); + FancyHolograms.get().getFancyLogger().error(e); + } + } + return hologramData; } } 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 6f2e3b31..21845b7c 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 @@ -3,6 +3,8 @@ package com.fancyinnovations.fancyholograms.storage.json.model; import com.fancyinnovations.fancyholograms.api.data.property.Visibility; import com.fancyinnovations.fancyholograms.api.hologram.HologramType; +import java.util.List; + public record JsonHologramData( String name, HologramType type, @@ -10,7 +12,8 @@ public record JsonHologramData( String worldName, Integer visibilityDistance, Visibility visibility, - String linkedNpcName + String linkedNpcName, + List traits ) { }