mirror of
https://github.com/FancyInnovations/FancyPlugins.git
synced 2025-12-05 23:33:36 +00:00
fancyholograms v3: Fix trait_trait trait saving and loading
This commit is contained in:
@@ -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<? extends HologramTrait> 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) {
|
||||
|
||||
@@ -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<UUID> 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<? extends HologramTrait> 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;
|
||||
}
|
||||
|
||||
@@ -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<? extends HologramTrait> 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 extends HologramTrait> T getTrait(Class<T> trait) {
|
||||
for (HologramTrait hologramTrait : hologram.getTraitTrait().getTraits()) {
|
||||
for (HologramTrait hologramTrait : hologram.getData().getTraitTrait().getTraits()) {
|
||||
if (hologramTrait.getClass().equals(trait)) {
|
||||
return (T) hologramTrait;
|
||||
}
|
||||
|
||||
@@ -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<HologramTrait> 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<String> traits
|
||||
) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<String> traits
|
||||
) {
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user