diff --git a/api/src/main/java/de/oliver/fancyholograms/api/data/HologramReferenceStackData.java b/api/src/main/java/de/oliver/fancyholograms/api/data/HologramReferenceStackData.java new file mode 100644 index 00000000..189e101c --- /dev/null +++ b/api/src/main/java/de/oliver/fancyholograms/api/data/HologramReferenceStackData.java @@ -0,0 +1,73 @@ +package de.oliver.fancyholograms.api.data; + +import de.oliver.fancyholograms.api.hologram.HologramType; +import org.bukkit.Location; +import org.bukkit.configuration.ConfigurationSection; + +import java.util.ArrayList; +import java.util.List; + +public class HologramReferenceStackData extends HologramData { + private List<String> holograms = new ArrayList<>(); + + /** + * @param name Name of hologram + * @param location Location of hologram + * Default values are already set + */ + public HologramReferenceStackData(String name, Location location) { + super(name, HologramType.HOLOGRAM_STACK, location); + } + + public List<String> getHolograms() { + return holograms; + } + + public HologramReferenceStackData setHolograms(List<String> holograms) { + this.holograms = holograms; + setHasChanges(true); + return this; + } + + public void addLine(String hologramName) { + holograms.add(hologramName); + setHasChanges(true); + } + + public void removeLine(int index) { + holograms.remove(index); + setHasChanges(true); + } + + @Override + public void read(ConfigurationSection section, String name) { + super.read(section, name); + + ConfigurationSection stackSection = section.getConfigurationSection("stack"); + if (stackSection != null) { + + } + } + + @Override + public void write(ConfigurationSection section, String name) { + super.write(section, name); + + for (int i = 0; i < holograms.size(); i++) { + section.set("stack." + i, holograms.get(i)); + } + } + + @Override + public HologramReferenceStackData copy(String name) { + HologramReferenceStackData hologramStackData = new HologramReferenceStackData(name, getLocation()); + hologramStackData + .setHolograms(this.getHolograms()) + .setVisibilityDistance(this.getVisibilityDistance()) + .setVisibility(this.getVisibility()) + .setPersistent(this.isPersistent()) + .setLinkedNpcName(this.getLinkedNpcName()); + + return hologramStackData; + } +} diff --git a/api/src/main/java/de/oliver/fancyholograms/api/data/HologramStackData.java b/api/src/main/java/de/oliver/fancyholograms/api/data/HologramStackData.java new file mode 100644 index 00000000..2b93b25c --- /dev/null +++ b/api/src/main/java/de/oliver/fancyholograms/api/data/HologramStackData.java @@ -0,0 +1,104 @@ +package de.oliver.fancyholograms.api.data; + +import de.oliver.fancyholograms.api.FancyHologramsPlugin; +import de.oliver.fancyholograms.api.hologram.HologramType; +import org.bukkit.Location; +import org.bukkit.configuration.ConfigurationSection; + +import java.util.ArrayList; +import java.util.List; + +public class HologramStackData extends HologramData { + private List<HologramData> content = new ArrayList<>(); + + /** + * @param name Name of hologram + * @param location Location of hologram + * Default values are already set + */ + public HologramStackData(String name, Location location) { + super(name, HologramType.HOLOGRAM_STACK, location); + } + + public List<HologramData> getContent() { + return content; + } + + public HologramStackData setContent(List<HologramData> content) { + this.content = content; + setHasChanges(true); + return this; + } + + public void addLine(HologramData data) { + content.add(data); + setHasChanges(true); + } + + public void removeLine(int index) { + content.remove(index); + setHasChanges(true); + } + + @Override + public void read(ConfigurationSection section, String name) { + super.read(section, name); + + ConfigurationSection stackSection = section.getConfigurationSection("stack"); + if (stackSection != null) { + for (String indexRaw : stackSection.getKeys(false)) { + ConfigurationSection holoSection = stackSection.getConfigurationSection(indexRaw); + if (holoSection == null) { + continue; + } + + String typeName = holoSection.getString("type"); + if (typeName == null) { + FancyHologramsPlugin.get().getPlugin().getLogger().warning("HologramType was not saved"); + continue; + } + + HologramType type = HologramType.getByName(typeName); + if (type == null) { + FancyHologramsPlugin.get().getPlugin().getLogger().warning("Could not parse HologramType"); + continue; + } + + DisplayHologramData displayData = null; + switch (type) { + case TEXT -> displayData = new TextHologramData(name, new Location(null, 0, 0, 0)); + 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.read(holoSection, name); + + int index = Integer.parseInt(indexRaw); + content.set(index, displayData); + } + } + } + + @Override + public void write(ConfigurationSection section, String name) { + super.write(section, name); + + for (int i = 0; i < content.size(); i++) { + HologramData hologramData = content.get(i); + ConfigurationSection dataSection = section.createSection("stack." + i); + hologramData.write(dataSection, hologramData.getName()); + } + } + + @Override + public HologramStackData copy(String name) { + HologramStackData hologramStackData = new HologramStackData(name, getLocation()); + hologramStackData + .setContent(this.getContent()) + .setVisibilityDistance(this.getVisibilityDistance()) + .setVisibility(this.getVisibility()) + .setPersistent(this.isPersistent()) + .setLinkedNpcName(this.getLinkedNpcName()); + + return hologramStackData; + } +} diff --git a/api/src/main/java/de/oliver/fancyholograms/api/hologram/Hologram.java b/api/src/main/java/de/oliver/fancyholograms/api/hologram/Hologram.java index 666d36d2..9a873258 100644 --- a/api/src/main/java/de/oliver/fancyholograms/api/hologram/Hologram.java +++ b/api/src/main/java/de/oliver/fancyholograms/api/hologram/Hologram.java @@ -48,7 +48,7 @@ public String getName() { return data.getName(); } - public final @NotNull HologramData getData() { + public @NotNull HologramData getData() { return this.data; } diff --git a/api/src/main/java/de/oliver/fancyholograms/api/hologram/HologramStack.java b/api/src/main/java/de/oliver/fancyholograms/api/hologram/HologramStack.java new file mode 100644 index 00000000..c67cc845 --- /dev/null +++ b/api/src/main/java/de/oliver/fancyholograms/api/hologram/HologramStack.java @@ -0,0 +1,111 @@ +package de.oliver.fancyholograms.api.hologram; + +import de.oliver.fancyholograms.api.FancyHologramsPlugin; +import de.oliver.fancyholograms.api.data.HologramData; +import de.oliver.fancyholograms.api.data.HologramStackData; +import org.bukkit.Bukkit; +import org.bukkit.entity.Display; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.*; + +public class HologramStack extends Hologram { + private final List<Hologram> holograms = new ArrayList<>(); + + protected HologramStack(@NotNull HologramStackData data) { + super(data); + } + + @Override + public @NotNull HologramStackData getData() { + return (HologramStackData) this.data; + } + + @Override + public @Nullable Display getDisplayEntity() { + return null; + } + + @Override + protected void create() { + for (HologramData hologramData : this.getData().getContent()) { + Hologram hologram = FancyHologramsPlugin.get().getHologramManager().create(hologramData); + this.holograms.add(hologram); + } + } + + @Override + protected void delete() { + for (Hologram hologram : holograms) { + hologram.delete(); + } + } + + @Override + protected void update() { + HashMap<HologramData, Hologram> currHolograms = new HashMap<>(); + for (Hologram hologram : this.holograms) { + currHolograms.put(hologram.getData(), hologram); + } + this.holograms.clear(); + + for (HologramData hologramData : this.getData().getContent()) { + Hologram hologram; + if (currHolograms.containsKey(hologramData)) { + hologram = currHolograms.get(hologramData); + currHolograms.remove(hologramData); + } else { + hologram = FancyHologramsPlugin.get().getHologramManager().create(hologramData); + } + + this.holograms.add(hologram); + } + + // Handle old/removed holograms + for (Hologram hologram : currHolograms.values()) { + for (UUID viewer : hologram.getViewers()) { + Player player = Bukkit.getPlayer(viewer); + if (player != null) { + forceHideHologram(player); + } + } + + hologram.delete(); + } + } + + @Override + protected boolean show(@NotNull Player player) { + boolean success = true; + + for (Hologram hologram : holograms) { + if (!hologram.show(player)) { + success = false; + } + } + + return success; + } + + @Override + protected boolean hide(@NotNull Player player) { + boolean success = true; + + for (Hologram hologram : holograms) { + if (!hologram.hide(player)) { + success = false; + } + } + + return success; + } + + @Override + protected void refresh(@NotNull Player player) { + for (Hologram hologram : holograms) { + hologram.refresh(player); + } + } +} diff --git a/api/src/main/java/de/oliver/fancyholograms/api/hologram/HologramType.java b/api/src/main/java/de/oliver/fancyholograms/api/hologram/HologramType.java index 432fcdd8..b18c6bc2 100644 --- a/api/src/main/java/de/oliver/fancyholograms/api/hologram/HologramType.java +++ b/api/src/main/java/de/oliver/fancyholograms/api/hologram/HologramType.java @@ -1,12 +1,14 @@ package de.oliver.fancyholograms.api.hologram; import java.util.Arrays; +import java.util.Collections; import java.util.List; public enum HologramType { TEXT(Arrays.asList("background", "textshadow", "textalignment", "seethrough", "setline", "removeline", "addline", "insertbefore", "insertafter", "updatetextinterval")), ITEM(List.of("item")), - BLOCK(List.of("block")); + BLOCK(List.of("block")), + HOLOGRAM_STACK(Collections.emptyList()); private final List<String> commands;