Skip to content

Commit

Permalink
Add multiple pages trait (proof of concept)
Browse files Browse the repository at this point in the history
  • Loading branch information
OliverSchlueter committed Mar 3, 2025
1 parent 1a5d4ff commit 5be4e95
Show file tree
Hide file tree
Showing 4 changed files with 89 additions and 5 deletions.
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package de.oliver.fancyholograms.api.hologram;

import com.google.common.collect.Sets;
import de.oliver.fancyholograms.api.FancyHolograms;
import de.oliver.fancyholograms.api.data.HologramData;
import de.oliver.fancyholograms.api.data.TextHologramData;
import de.oliver.fancyholograms.api.trait.HologramTrait;
import de.oliver.fancyholograms.api.trait.HologramTraitTrait;
import net.kyori.adventure.text.Component;
import org.bukkit.Color;
Expand All @@ -12,6 +14,7 @@
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;
Expand Down Expand Up @@ -102,7 +105,22 @@ public final boolean isViewer(@NotNull final UUID player) {
}

@ApiStatus.Experimental
public HologramData addTrait(HologramTraitTrait trait) {
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;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import de.oliver.fancyholograms.storage.HologramStorage;
import de.oliver.fancyholograms.storage.YamlHologramStorage;
import de.oliver.fancyholograms.trait.HologramTraitRegistryImpl;
import de.oliver.fancyholograms.trait.builtin.MultiplePagesTrait;
import de.oliver.fancyholograms.util.PluginUtils;
import de.oliver.fancylib.FancyLib;
import de.oliver.fancylib.VersionConfig;
Expand Down Expand Up @@ -210,6 +211,8 @@ public void onEnable() {

FHConversionRegistry.registerBuiltInConverters();

traitRegistry.register(MultiplePagesTrait.class);

fancyLogger.info("Successfully enabled FancyHolograms version %s".formatted(getDescription().getVersion()));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,13 @@ public HologramRegistryImpl() {
this.holograms = new ConcurrentHashMap<>();
}

@Override
@Override
public boolean register(Hologram hologram) {
FancyHologramsPlugin.get().getController().refreshHologram(hologram, Bukkit.getOnlinePlayers());
FancyHologramsPlugin.get().getController().refreshHologram(hologram, Bukkit.getOnlinePlayers());

boolean registered = holograms.putIfAbsent(hologram.getData().getName(), hologram) != null;
boolean registered = holograms.putIfAbsent(hologram.getData().getName(), hologram) != null;

hologram.getTraitTrait().onRegister();
hologram.getTraitTrait().onRegister();

return registered;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package de.oliver.fancyholograms.trait.builtin;

import de.oliver.fancyholograms.api.data.TextHologramData;
import de.oliver.fancyholograms.api.trait.HologramTrait;
import org.jetbrains.annotations.ApiStatus;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

@ApiStatus.Experimental
public class MultiplePagesTrait extends HologramTrait {

private static final int NEXT_PAGE_DELAY_SECONDS = 5;

private final List<Page> pages;
private int currentPageIdx;

public MultiplePagesTrait() {
super("multiple_pages");
this.pages = new ArrayList<>();
this.currentPageIdx = 0;

this.pages.add(new Page(List.of("Page 1", "Line 1", "Line 2")));
this.pages.add(new Page(List.of("Page 2", "Line 1", "Line 2")));
this.pages.add(new Page(List.of("Page 3", "Line 1", "Line 2")));
}

@Override
public void onAttach() {
if (!(hologram.getData() instanceof TextHologramData td)) {
throw new IllegalStateException("Hologram must be text hologram to use MultiplePagesTrait");
}

hologramThread.scheduleWithFixedDelay(() -> {
Page currentPage = pages.get(currentPageIdx);
td.setText(new ArrayList<>(currentPage.lines()));

currentPageIdx = (currentPageIdx + 1) % pages.size(); // cycle through pages
}, 0, NEXT_PAGE_DELAY_SECONDS, TimeUnit.SECONDS);
}

@Override
public void save() {
//TODO save pages to data
}

@Override
public void load() {
//TODO load pages from data
}

record Page(List<String> lines) {

public void addLine(String line) {
lines.add(line);
}

public void removeLine(int index) {
lines.remove(index);
}
}
}

0 comments on commit 5be4e95

Please sign in to comment.