24package com.dreamfirestudios.dreamcore.DreamScoreboard;
26import com.dreamfirestudios.dreamcore.DreamCore;
27import com.dreamfirestudios.dreamcore.DreamJava.DreamClassID;
29import org.bukkit.Bukkit;
30import org.bukkit.entity.Player;
31import org.bukkit.scoreboard.DisplaySlot;
32import org.bukkit.scoreboard.Objective;
33import org.bukkit.scoreboard.Scoreboard;
35import java.util.ArrayList;
36import java.util.Collections;
65 private Scoreboard scoreboard;
66 private List<DreamScoreboardLines> frames =
new ArrayList<>();
67 private int frameIndex = 0;
70 @Getter
private final List<Player> viewers =
new ArrayList<>();
72 @Getter
private boolean paused =
true;
73 private boolean sidebarInitialized =
false;
81 return player !=
null && viewers.contains(player);
97 if (event.isCancelled())
return;
99 player.setScoreboard(scoreboard);
115 if (event.isCancelled())
return;
117 if (Bukkit.getScoreboardManager() !=
null) {
118 player.setScoreboard(Bukkit.getScoreboardManager().getMainScoreboard());
120 viewers.remove(player);
128 for (Player p :
new ArrayList<>(viewers))
removePlayer(p);
136 if (frames.isEmpty() || viewers.isEmpty() || paused)
return;
138 ensureSidebarCreated();
143 frameIndex = (frameIndex + 1) % frames.size();
151 this.paused = paused;
157 private void ensureSidebarCreated() {
158 if (sidebarInitialized)
return;
161 final String objectiveId =
"sb_" + getClassID().toString().replace(
"-",
"").substring(0, 12);
162 Objective existing = scoreboard.getObjective(DisplaySlot.SIDEBAR);
163 if (existing ==
null) {
165 frames.get(0).CreateLine(scoreboard, objectiveId);
167 sidebarInitialized =
true;
182 private final List<Player> initialPlayers =
new ArrayList<>();
183 private final List<DreamScoreboardLines> frames =
new ArrayList<>();
184 private boolean startPaused =
true;
199 if (frame ==
null || repeatFrames <= 0)
200 throw new IllegalArgumentException(
"frame cannot be null and repeatFrames must be > 0");
201 for (
int i = 0; i < repeatFrames; i++) frames.add(frame);
211 if (players !=
null) Collections.addAll(initialPlayers, players);
221 this.startPaused = paused;
242 if (Bukkit.getScoreboardManager() ==
null)
243 throw new IllegalStateException(
"ScoreboardManager is not ready");
244 board.scoreboard = Bukkit.getScoreboardManager().getNewScoreboard();
245 board.frames =
new ArrayList<>(frames);
246 board.paused = startPaused;
252 initialPlayers.forEach(board::addPlayer);
static final LinkedHashMap< UUID, DreamScoreboard > DreamScoreboards
Represents a single “frame” of a sidebar scoreboard: a title plus a set of numbered lines.
void UpdateLine(Scoreboard scoreboard)
Back-compat. Use updateSidebar(Scoreboard).
Builder for assembling a scoreboard with frames and initial viewers.
PulseScoreboardBuilder addLineHolder(DreamScoreboardLines frame, int repeatFrames)
Adds a frame multiple times to extend its on-screen duration.
PulseScoreboardBuilder addPlayer(Player... players)
Adds one or more players as initial viewers.
PulseScoreboardBuilder paused(boolean paused)
Sets the initial paused state.
DreamScoreboard create(boolean replaceExisting)
Builds the scoreboard, fires ScoreboardCreatedEvent, and adds initial viewers.
Manages an animated sidebar scoreboard composed of multiple frames.
void clearViewers()
Removes all viewers from this scoreboard.
void removePlayer(Player player)
Removes a player from viewing this scoreboard.
static PulseScoreboardBuilder builder()
Creates a builder for constructing a DreamScoreboard.
void displayNextFrame()
Advances the animated scoreboard by one frame.
void addPlayer(Player player)
Adds a player as a viewer of this scoreboard.
boolean isPlayerViewing(Player player)
Checks whether a player is currently viewing this scoreboard.
void setPaused(boolean paused)
Sets the paused state for animation.
Fired when a DreamScoreboard is created via the builder.
Fired before a player is added as a viewer of a DreamScoreboard.
Fired before a player is removed from viewing a DreamScoreboard.