Skip to content
This repository was archived by the owner on Apr 19, 2025. It is now read-only.

Commit 5be4e95

Browse files
Add multiple pages trait (proof of concept)
1 parent 1a5d4ff commit 5be4e95

File tree

4 files changed

+89
-5
lines changed

4 files changed

+89
-5
lines changed

api/src/main/java/de/oliver/fancyholograms/api/hologram/Hologram.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package de.oliver.fancyholograms.api.hologram;
22

33
import com.google.common.collect.Sets;
4+
import de.oliver.fancyholograms.api.FancyHolograms;
45
import de.oliver.fancyholograms.api.data.HologramData;
56
import de.oliver.fancyholograms.api.data.TextHologramData;
7+
import de.oliver.fancyholograms.api.trait.HologramTrait;
68
import de.oliver.fancyholograms.api.trait.HologramTraitTrait;
79
import net.kyori.adventure.text.Component;
810
import org.bukkit.Color;
@@ -12,6 +14,7 @@
1214
import org.jetbrains.annotations.Nullable;
1315
import org.lushplugins.chatcolorhandler.ModernChatColorHandler;
1416

17+
import java.lang.reflect.InvocationTargetException;
1518
import java.util.HashSet;
1619
import java.util.Set;
1720
import java.util.UUID;
@@ -102,7 +105,22 @@ public final boolean isViewer(@NotNull final UUID player) {
102105
}
103106

104107
@ApiStatus.Experimental
105-
public HologramData addTrait(HologramTraitTrait trait) {
108+
public HologramData addTrait(HologramTrait trait) {
109+
traitTrait.addTrait(trait);
110+
return data;
111+
}
112+
113+
@ApiStatus.Experimental
114+
public HologramData addTrait(Class<? extends HologramTrait> traitClass) {
115+
HologramTrait trait = null;
116+
try {
117+
trait = traitClass.getConstructor(null).newInstance();
118+
} catch (InstantiationException | IllegalAccessException | InvocationTargetException |
119+
NoSuchMethodException e) {
120+
FancyHolograms.get().getFancyLogger().error("Failed to instantiate trait " + traitClass.getSimpleName());
121+
FancyHolograms.get().getFancyLogger().error(e);
122+
}
123+
106124
traitTrait.addTrait(trait);
107125
return data;
108126
}

src/main/java/de/oliver/fancyholograms/main/FancyHologramsPlugin.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import de.oliver.fancyholograms.storage.HologramStorage;
3030
import de.oliver.fancyholograms.storage.YamlHologramStorage;
3131
import de.oliver.fancyholograms.trait.HologramTraitRegistryImpl;
32+
import de.oliver.fancyholograms.trait.builtin.MultiplePagesTrait;
3233
import de.oliver.fancyholograms.util.PluginUtils;
3334
import de.oliver.fancylib.FancyLib;
3435
import de.oliver.fancylib.VersionConfig;
@@ -210,6 +211,8 @@ public void onEnable() {
210211

211212
FHConversionRegistry.registerBuiltInConverters();
212213

214+
traitRegistry.register(MultiplePagesTrait.class);
215+
213216
fancyLogger.info("Successfully enabled FancyHolograms version %s".formatted(getDescription().getVersion()));
214217
}
215218

src/main/java/de/oliver/fancyholograms/registry/HologramRegistryImpl.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,13 @@ public HologramRegistryImpl() {
2020
this.holograms = new ConcurrentHashMap<>();
2121
}
2222

23-
@Override
23+
@Override
2424
public boolean register(Hologram hologram) {
25-
FancyHologramsPlugin.get().getController().refreshHologram(hologram, Bukkit.getOnlinePlayers());
25+
FancyHologramsPlugin.get().getController().refreshHologram(hologram, Bukkit.getOnlinePlayers());
2626

27-
boolean registered = holograms.putIfAbsent(hologram.getData().getName(), hologram) != null;
27+
boolean registered = holograms.putIfAbsent(hologram.getData().getName(), hologram) != null;
2828

29-
hologram.getTraitTrait().onRegister();
29+
hologram.getTraitTrait().onRegister();
3030

3131
return registered;
3232
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package de.oliver.fancyholograms.trait.builtin;
2+
3+
import de.oliver.fancyholograms.api.data.TextHologramData;
4+
import de.oliver.fancyholograms.api.trait.HologramTrait;
5+
import org.jetbrains.annotations.ApiStatus;
6+
7+
import java.util.ArrayList;
8+
import java.util.List;
9+
import java.util.concurrent.TimeUnit;
10+
11+
@ApiStatus.Experimental
12+
public class MultiplePagesTrait extends HologramTrait {
13+
14+
private static final int NEXT_PAGE_DELAY_SECONDS = 5;
15+
16+
private final List<Page> pages;
17+
private int currentPageIdx;
18+
19+
public MultiplePagesTrait() {
20+
super("multiple_pages");
21+
this.pages = new ArrayList<>();
22+
this.currentPageIdx = 0;
23+
24+
this.pages.add(new Page(List.of("Page 1", "Line 1", "Line 2")));
25+
this.pages.add(new Page(List.of("Page 2", "Line 1", "Line 2")));
26+
this.pages.add(new Page(List.of("Page 3", "Line 1", "Line 2")));
27+
}
28+
29+
@Override
30+
public void onAttach() {
31+
if (!(hologram.getData() instanceof TextHologramData td)) {
32+
throw new IllegalStateException("Hologram must be text hologram to use MultiplePagesTrait");
33+
}
34+
35+
hologramThread.scheduleWithFixedDelay(() -> {
36+
Page currentPage = pages.get(currentPageIdx);
37+
td.setText(new ArrayList<>(currentPage.lines()));
38+
39+
currentPageIdx = (currentPageIdx + 1) % pages.size(); // cycle through pages
40+
}, 0, NEXT_PAGE_DELAY_SECONDS, TimeUnit.SECONDS);
41+
}
42+
43+
@Override
44+
public void save() {
45+
//TODO save pages to data
46+
}
47+
48+
@Override
49+
public void load() {
50+
//TODO load pages from data
51+
}
52+
53+
record Page(List<String> lines) {
54+
55+
public void addLine(String line) {
56+
lines.add(line);
57+
}
58+
59+
public void removeLine(int index) {
60+
lines.remove(index);
61+
}
62+
}
63+
}

0 commit comments

Comments
 (0)