Skip to content

Commit 83f44ec

Browse files
committed
Merge remote-tracking branch 'origin/main'
2 parents 67a8f20 + 07d8a37 commit 83f44ec

File tree

49 files changed

+1597
-675
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+1597
-675
lines changed

README.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ Join the [Discord](https://discord.gg/v7nmTDTW8W) or create an issue for support
1111
- Sidebars. Up to 42 characters (depends on the formatting) for 1.12.2 and below, no limit for newer versions
1212
- Teams. Supports showing different properties (display name, prefix, entries etc.) of the same team to different
1313
players
14+
- Objectives.
1415
- Doesn't require extra dependencies (assuming you're targeting the latest version of Paper)
1516
- Packet-level, meaning it works with other scoreboard plugins (and is faster)
1617
- Supports [Folia](https://github.com/PaperMC/Folia)
@@ -264,3 +265,17 @@ team.display(player, newTeamDisplay);
264265
// After you've finished using the TeamManager, make sure to close it to prevent a memory leak:
265266
teamManager.close();
266267
```
268+
269+
### ObjectiveManager
270+
271+
```java
272+
ObjectiveManager objectiveManager = scoreboardLibrary.createObjectiveManager();
273+
ScoreboardObjective objective = objectiveManager.create("coolobjective");
274+
objective.value(Component.text("Display name"));
275+
objective.score(player.getName(), 69420);
276+
277+
objectiveManager.addPlayer(player); // Make a player see the objectives
278+
279+
// After you've finished using the ObjectiveManager, make sure to close it to prevent a memory leak:
280+
objectiveManager.close();
281+
```

api/src/main/java/net/megavex/scoreboardlibrary/api/ScoreboardLibrary.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package net.megavex.scoreboardlibrary.api;
22

33
import net.megavex.scoreboardlibrary.api.exception.NoPacketAdapterAvailableException;
4+
import net.megavex.scoreboardlibrary.api.objective.ObjectiveManager;
45
import net.megavex.scoreboardlibrary.api.sidebar.Sidebar;
56
import net.megavex.scoreboardlibrary.api.team.TeamManager;
67
import org.bukkit.plugin.Plugin;
@@ -86,6 +87,8 @@ public interface ScoreboardLibrary {
8687
*/
8788
@NotNull TeamManager createTeamManager();
8889

90+
@NotNull ObjectiveManager createObjectiveManager();
91+
8992
/**
9093
* Closes this scoreboard-library instance.
9194
* Should always be called when the plugin is disabled
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package net.megavex.scoreboardlibrary.api.noop;
2+
3+
import net.megavex.scoreboardlibrary.api.objective.ObjectiveDisplaySlot;
4+
import net.megavex.scoreboardlibrary.api.objective.ObjectiveManager;
5+
import net.megavex.scoreboardlibrary.api.objective.ScoreboardObjective;
6+
import org.bukkit.entity.Player;
7+
import org.jetbrains.annotations.NotNull;
8+
9+
import java.util.*;
10+
11+
class NoopObjectiveManager implements ObjectiveManager {
12+
private final Map<String, ScoreboardObjective> objectives = new HashMap<>();
13+
private final Map<ObjectiveDisplaySlot, ScoreboardObjective> displaySlots = new HashMap<>();
14+
private final Set<Player> players = new HashSet<>();
15+
private boolean isClosed = true;
16+
17+
@Override
18+
public @NotNull ScoreboardObjective create(@NotNull String name) {
19+
return objectives.computeIfAbsent(name, i -> null);
20+
}
21+
22+
@Override
23+
public void remove(@NotNull ScoreboardObjective objective) {
24+
objectives.values().remove(objective);
25+
}
26+
27+
@Override
28+
public void display(@NotNull ObjectiveDisplaySlot displaySlot, @NotNull ScoreboardObjective objective) {
29+
displaySlots.put(displaySlot, objective);
30+
}
31+
32+
@Override
33+
public @NotNull Collection<Player> players() {
34+
return Collections.unmodifiableSet(players);
35+
}
36+
37+
@Override
38+
public boolean addPlayer(@NotNull Player player) {
39+
return players.add(player);
40+
}
41+
42+
@Override
43+
public boolean removePlayer(@NotNull Player player) {
44+
return players.remove(player);
45+
}
46+
47+
@Override
48+
public void close() {
49+
isClosed = true;
50+
}
51+
52+
@Override
53+
public boolean closed() {
54+
return isClosed;
55+
}
56+
}

api/src/main/java/net/megavex/scoreboardlibrary/api/noop/NoopScoreboardLibrary.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package net.megavex.scoreboardlibrary.api.noop;
22

33
import net.megavex.scoreboardlibrary.api.ScoreboardLibrary;
4+
import net.megavex.scoreboardlibrary.api.objective.ObjectiveManager;
45
import net.megavex.scoreboardlibrary.api.sidebar.Sidebar;
56
import net.megavex.scoreboardlibrary.api.team.TeamManager;
67
import org.jetbrains.annotations.NotNull;
@@ -28,6 +29,12 @@ public final class NoopScoreboardLibrary implements ScoreboardLibrary {
2829
return new NoopTeamManager();
2930
}
3031

32+
@Override
33+
public @NotNull ObjectiveManager createObjectiveManager() {
34+
checkClosed();
35+
return new NoopObjectiveManager();
36+
}
37+
3138
@Override
3239
public void close() {
3340
closed = true;
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package net.megavex.scoreboardlibrary.api.noop;
2+
3+
import net.kyori.adventure.text.Component;
4+
import net.megavex.scoreboardlibrary.api.objective.ObjectiveRenderType;
5+
import net.megavex.scoreboardlibrary.api.objective.ScoreboardObjective;
6+
import org.jetbrains.annotations.NotNull;
7+
8+
import java.util.HashMap;
9+
import java.util.Map;
10+
11+
public class NoopScoreboardObjective implements ScoreboardObjective {
12+
private final Map<String, Integer> scores = new HashMap<>();
13+
private Component value;
14+
private ObjectiveRenderType renderType;
15+
16+
@Override
17+
public @NotNull Component value() {
18+
return value;
19+
}
20+
21+
@Override
22+
public @NotNull ScoreboardObjective value(@NotNull Component value) {
23+
this.value = value;
24+
return this;
25+
}
26+
27+
@Override
28+
public @NotNull ObjectiveRenderType renderType() {
29+
return renderType;
30+
}
31+
32+
@Override
33+
public @NotNull ScoreboardObjective renderType(@NotNull ObjectiveRenderType renderType) {
34+
this.renderType = renderType;
35+
return this;
36+
}
37+
38+
@Override
39+
public Integer score(@NotNull String entry) {
40+
return scores.get(entry);
41+
}
42+
43+
@Override
44+
public @NotNull ScoreboardObjective score(@NotNull String entry, int score) {
45+
scores.put(entry, score);
46+
return this;
47+
}
48+
49+
@Override
50+
public @NotNull ScoreboardObjective removeScore(@NotNull String entry) {
51+
scores.remove(entry);
52+
return this;
53+
}
54+
}
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package net.megavex.scoreboardlibrary.api.objective;
2+
3+
import com.google.common.base.Preconditions;
4+
import net.kyori.adventure.text.format.NamedTextColor;
5+
import org.jetbrains.annotations.ApiStatus;
6+
import org.jetbrains.annotations.NotNull;
7+
8+
/**
9+
* Represents all valid display slots that objectives can be shown in.
10+
*
11+
* @see <a href="https://minecraft.wiki/w/Scoreboard#Display_slots">Minecraft Wiki</a>
12+
*/
13+
@ApiStatus.NonExtendable
14+
public interface ObjectiveDisplaySlot {
15+
static @NotNull PlayerList playerList() {
16+
return PlayerList.INSTANCE;
17+
}
18+
19+
static @NotNull Sidebar sidebar() {
20+
return Sidebar.INSTANCE;
21+
}
22+
23+
static @NotNull BelowName belowName() {
24+
return BelowName.INSTANCE;
25+
}
26+
27+
static @NotNull TeamSidebar teamSidebar(@NotNull NamedTextColor teamColor) {
28+
Preconditions.checkNotNull(teamColor);
29+
return new TeamSidebar(teamColor);
30+
}
31+
32+
class PlayerList implements ObjectiveDisplaySlot {
33+
private static final PlayerList INSTANCE = new PlayerList();
34+
35+
private PlayerList() {
36+
}
37+
38+
@Override
39+
public String toString() {
40+
return "PlayerList";
41+
}
42+
}
43+
44+
class Sidebar implements ObjectiveDisplaySlot {
45+
private static final Sidebar INSTANCE = new Sidebar();
46+
47+
private Sidebar() {
48+
}
49+
50+
@Override
51+
public String toString() {
52+
return "Sidebar";
53+
}
54+
}
55+
56+
class BelowName implements ObjectiveDisplaySlot {
57+
private static final BelowName INSTANCE = new BelowName();
58+
59+
private BelowName() {
60+
}
61+
62+
@Override
63+
public String toString() {
64+
return "BelowName";
65+
}
66+
}
67+
68+
class TeamSidebar implements ObjectiveDisplaySlot {
69+
private final NamedTextColor teamColor;
70+
71+
private TeamSidebar(@NotNull NamedTextColor teamColor) {
72+
this.teamColor = teamColor;
73+
}
74+
75+
public @NotNull NamedTextColor teamColor() {
76+
return teamColor;
77+
}
78+
79+
@Override
80+
public boolean equals(Object o) {
81+
if (this == o) return true;
82+
if (o == null || getClass() != o.getClass()) return false;
83+
TeamSidebar that = (TeamSidebar) o;
84+
return teamColor.equals(that.teamColor);
85+
}
86+
87+
@Override
88+
public int hashCode() {
89+
return teamColor.hashCode();
90+
}
91+
92+
@Override
93+
public String toString() {
94+
return "TeamSidebar{teamColor=" + teamColor + "}";
95+
}
96+
}
97+
}
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package net.megavex.scoreboardlibrary.api.objective;
2+
3+
import org.bukkit.entity.Player;
4+
import org.jetbrains.annotations.NotNull;
5+
6+
import java.util.Collection;
7+
8+
/**
9+
* Manages a group of {@link ScoreboardObjective}s.
10+
* Note: this class is not thread-safe.
11+
*/
12+
public interface ObjectiveManager {
13+
/**
14+
* Creates an objective
15+
*
16+
* @param name Name of the objective
17+
* @return A newly created objective, or an existing one if the name was already registered
18+
*/
19+
@NotNull ScoreboardObjective create(@NotNull String name);
20+
21+
/**
22+
* Removes an objective.
23+
*
24+
* @param objective Objective to remove
25+
*/
26+
void remove(@NotNull ScoreboardObjective objective);
27+
28+
/**
29+
* Updates the objective shown at a display slot
30+
*
31+
* @param displaySlot Display slot value
32+
* @param objective Objective to display at that slot
33+
*/
34+
void display(@NotNull ObjectiveDisplaySlot displaySlot, @NotNull ScoreboardObjective objective);
35+
36+
/**
37+
* @return Players in this ObjectiveManager
38+
*/
39+
@NotNull Collection<Player> players();
40+
41+
/**
42+
* Adds a player to this ObjectiveManager
43+
*
44+
* @param player Player to add to ObjectiveManager
45+
* @return Whether the player was added
46+
*/
47+
boolean addPlayer(@NotNull Player player);
48+
49+
/**
50+
* Adds multiple players to this ObjectiveManager
51+
*
52+
* @param players Players to add
53+
*/
54+
default void addPlayers(@NotNull Collection<Player> players) {
55+
for (Player player : players) {
56+
addPlayer(player);
57+
}
58+
}
59+
60+
/**
61+
* Removes a player from this ObjectiveManager
62+
*
63+
* @param player Player to remove
64+
* @return Whether the player was removed
65+
*/
66+
boolean removePlayer(@NotNull Player player);
67+
68+
/**
69+
* Removes multiple players to this ObjectiveManager
70+
*
71+
* @param players Players to add
72+
*/
73+
default void removePlayers(@NotNull Collection<Player> players) {
74+
for (Player player : players) {
75+
removePlayer(player);
76+
}
77+
}
78+
79+
/**
80+
* Closes this ObjectiveManager.
81+
*/
82+
void close();
83+
84+
/**
85+
* @return Whether this ObjectiveManager is closed
86+
*/
87+
boolean closed();
88+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package net.megavex.scoreboardlibrary.api.objective;
2+
3+
/**
4+
* Represents all valid render types of an objective.
5+
*/
6+
public enum ObjectiveRenderType {
7+
INTEGER,
8+
HEARTS
9+
}

0 commit comments

Comments
 (0)