Skip to content

Commit 7e95c40

Browse files
committed
Minor scoreboard changes
1 parent 5cf84c0 commit 7e95c40

File tree

9 files changed

+235
-23
lines changed

9 files changed

+235
-23
lines changed

src/main/java/vg/civcraft/mc/civmodcore/CivModCorePlugin.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@
1313
import vg.civcraft.mc.civmodcore.locations.chunkmeta.api.ChunkMetaAPI;
1414
import vg.civcraft.mc.civmodcore.playersettings.PlayerSettingAPI;
1515
import vg.civcraft.mc.civmodcore.playersettings.gui.ConfigCommand;
16-
import vg.civcraft.mc.civmodcore.scoreboard.ScoreBoardListener;
16+
import vg.civcraft.mc.civmodcore.scoreboard.bottom.BottomLineAPI;
17+
import vg.civcraft.mc.civmodcore.scoreboard.side.ScoreBoardListener;
1718

1819
import java.sql.SQLException;
1920

@@ -48,7 +49,7 @@ public void onEnable() {
4849
// Load APIs
4950
ItemNames.loadItemNames();
5051
EnchantmentNames.loadEnchantmentNames();
51-
new DialogManager();
52+
BottomLineAPI.init();
5253
if (database != null) {
5354
ChunkDAO dao = new ChunkDAO(database, this);
5455
if (dao.updateDatabase()) {

src/main/java/vg/civcraft/mc/civmodcore/chatDialog/DialogManager.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
public class DialogManager {
1010

1111
private static Map<UUID, Dialog> dialogs = new TreeMap<>();
12+
13+
private DialogManager() {}
1214

1315
public static Dialog getDialog(Player p) {
1416
return getDialog(p.getUniqueId());

src/main/java/vg/civcraft/mc/civmodcore/locations/chunkmeta/ChunkCoord.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,13 @@
55
import java.util.Objects;
66
import java.util.TreeMap;
77
import java.util.function.Supplier;
8+
import java.util.logging.Level;
89

910
import org.bukkit.World;
1011

11-
public class ChunkCoord implements Comparable<ChunkCoord>{
12+
import vg.civcraft.mc.civmodcore.CivModCorePlugin;
13+
14+
public class ChunkCoord implements Comparable<ChunkCoord> {
1215

1316
/**
1417
* When was this chunk last loaded in Minecraft as UNIX timestamp
@@ -50,7 +53,7 @@ public class ChunkCoord implements Comparable<ChunkCoord>{
5053
this.lastLoadingTime = -1;
5154
this.lastUnloadingTime = -1;
5255
}
53-
56+
5457
/**
5558
* @return World this instance is in
5659
*/
@@ -166,7 +169,14 @@ void loadAll() {
166169
ChunkMeta<?> chunk = generator.getValue().get();
167170
chunk.setChunkCoord(this);
168171
chunk.setPluginID(generator.getKey());
169-
chunk.populate();
172+
try {
173+
chunk.populate();
174+
} catch (Exception e) {
175+
// need to catch everything here, otherwise we block the main thread forever
176+
// once it tries to read this
177+
CivModCorePlugin.getInstance().getLogger().log(Level.SEVERE,
178+
"Failed to load chunk data", e);
179+
}
170180
addChunkMeta(chunk);
171181
}
172182
this.notifyAll();

src/main/java/vg/civcraft/mc/civmodcore/playersettings/impl/BooleanSetting.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@
1212

1313
public class BooleanSetting extends PlayerSetting<Boolean> {
1414

15-
public BooleanSetting(JavaPlugin owningPlugin, Boolean defaultValue, String name, String identifier, ItemStack gui,
15+
public BooleanSetting(JavaPlugin owningPlugin, Boolean defaultValue, String name, String identifier,
1616
String description) {
17-
super(owningPlugin, defaultValue, name, identifier, gui, description);
17+
super(owningPlugin, defaultValue, name, identifier, new ItemStack(Material.STONE), description);
1818
}
1919

2020
@Override
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package vg.civcraft.mc.civmodcore.scoreboard.bottom;
2+
3+
import java.util.Map;
4+
import java.util.UUID;
5+
import java.util.Map.Entry;
6+
import java.util.TreeMap;
7+
import java.util.function.BiFunction;
8+
9+
import org.bukkit.Bukkit;
10+
import org.bukkit.entity.Player;
11+
import org.bukkit.scheduler.BukkitRunnable;
12+
13+
import vg.civcraft.mc.civmodcore.CivModCorePlugin;
14+
15+
public class BottomLine implements Comparable<BottomLine>{
16+
17+
private Map <UUID, String> texts;
18+
private String identifier;
19+
private BukkitRunnable updater;
20+
private int priority;
21+
22+
BottomLine(String identifier, int priority) {
23+
this.identifier = identifier;
24+
this.priority = priority;
25+
this.texts = new TreeMap<>();
26+
}
27+
28+
public String getIdentifier() {
29+
return identifier;
30+
}
31+
32+
public void updatePlayer(Player player, String text) {
33+
texts.put(player.getUniqueId(), text);
34+
}
35+
36+
public String getCurrentText(UUID uuid) {
37+
return texts.get(uuid);
38+
}
39+
40+
public void updatePeriodically(BiFunction<Player, String, String> updateFunction, long delay) {
41+
if (updater != null) {
42+
updater.cancel();
43+
}
44+
updater = new BukkitRunnable() {
45+
46+
@Override
47+
public void run() {
48+
for (Entry<UUID, String> entry : texts.entrySet()) {
49+
Player player = Bukkit.getPlayer(entry.getKey());
50+
if (player != null) {
51+
String newText = updateFunction.apply(player, entry.getValue());
52+
if (!newText.equals(entry.getValue()) ) {
53+
entry.setValue(newText);
54+
BottomLineAPI.refreshIndividually(player.getUniqueId());
55+
}
56+
57+
}
58+
}
59+
}
60+
};
61+
updater.runTaskTimer(CivModCorePlugin.getInstance(), delay, delay);
62+
}
63+
64+
public void removePlayer(Player player) {
65+
texts.remove(player.getUniqueId());
66+
BottomLineAPI.refreshIndividually(player.getUniqueId());
67+
}
68+
69+
Map<UUID, String> getAll() {
70+
return texts;
71+
}
72+
73+
@Override
74+
public boolean equals(Object o) {
75+
return o == this;
76+
}
77+
78+
@Override
79+
public int compareTo(BottomLine o) {
80+
int prio = Integer.compare(priority, o.priority);
81+
if (prio != 0) {
82+
return prio;
83+
}
84+
return Integer.compare(hashCode(), o.hashCode());
85+
}
86+
87+
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package vg.civcraft.mc.civmodcore.scoreboard.bottom;
2+
3+
import java.util.Map;
4+
import java.util.Map.Entry;
5+
import java.util.Set;
6+
import java.util.TreeMap;
7+
import java.util.TreeSet;
8+
import java.util.UUID;
9+
10+
import org.bukkit.Bukkit;
11+
import org.bukkit.ChatColor;
12+
import org.bukkit.entity.Player;
13+
import org.bukkit.scheduler.BukkitRunnable;
14+
15+
import net.md_5.bungee.api.ChatMessageType;
16+
import net.md_5.bungee.api.chat.TextComponent;
17+
import vg.civcraft.mc.civmodcore.CivModCorePlugin;
18+
19+
public class BottomLineAPI {
20+
21+
private static Set<BottomLine> lines = new TreeSet<>();
22+
private static final String SEPARATOR = ChatColor.BOLD + " " + ChatColor.BLACK + "|| " + ChatColor.RESET;
23+
24+
public static void init() {
25+
BukkitRunnable run = new BukkitRunnable() {
26+
27+
@Override
28+
public void run() {
29+
refreshAll();
30+
}
31+
};
32+
run.runTaskTimer(CivModCorePlugin.getInstance(), 15, 15);
33+
}
34+
35+
public BottomLine createBottomLine(String identifier, int priority) {
36+
BottomLine line = new BottomLine(identifier, priority);
37+
lines.add(line);
38+
return line;
39+
}
40+
41+
public void deleteBottomLine(BottomLine line) {
42+
lines.remove(line);
43+
}
44+
45+
public static void refreshIndividually(UUID uuid) {
46+
Player player = Bukkit.getPlayer(uuid);
47+
if (player == null) {
48+
return;
49+
}
50+
StringBuilder sb = new StringBuilder();
51+
for (BottomLine line : lines) {
52+
for (Entry<UUID, String> entry : line.getAll().entrySet()) {
53+
if (sb.length() > 0) {
54+
sb.append(SEPARATOR);
55+
}
56+
sb.append(entry.getValue());
57+
}
58+
}
59+
player.spigot().sendMessage(ChatMessageType.ACTION_BAR, new TextComponent(sb.toString()));
60+
}
61+
62+
private static void refreshAll() {
63+
Map<UUID, StringBuilder> texts = new TreeMap<>();
64+
for (BottomLine line : lines) {
65+
for (Entry<UUID, String> entry : line.getAll().entrySet()) {
66+
StringBuilder sb = texts.computeIfAbsent(entry.getKey(), u -> new StringBuilder());
67+
if (sb.length() > 0) {
68+
sb.append(SEPARATOR);
69+
}
70+
sb.append(entry.getValue());
71+
}
72+
}
73+
for (Entry<UUID, StringBuilder> entry : texts.entrySet()) {
74+
Player player = Bukkit.getPlayer(entry.getKey());
75+
if (player != null) {
76+
player.spigot().sendMessage(ChatMessageType.ACTION_BAR, new TextComponent(entry.getValue().toString()));
77+
}
78+
}
79+
}
80+
81+
}

src/main/java/vg/civcraft/mc/civmodcore/scoreboard/CivScoreBoard.java renamed to src/main/java/vg/civcraft/mc/civmodcore/scoreboard/side/CivScoreBoard.java

Lines changed: 45 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,74 @@
1-
package vg.civcraft.mc.civmodcore.scoreboard;
1+
package vg.civcraft.mc.civmodcore.scoreboard.side;
22

33
import java.util.Map;
44
import java.util.Map.Entry;
5+
import java.util.function.BiFunction;
56
import java.util.TreeMap;
67
import java.util.UUID;
78

89
import org.bukkit.Bukkit;
910
import org.bukkit.entity.Player;
11+
import org.bukkit.scheduler.BukkitRunnable;
1012
import org.bukkit.scoreboard.DisplaySlot;
1113
import org.bukkit.scoreboard.Objective;
1214
import org.bukkit.scoreboard.Score;
1315
import org.bukkit.scoreboard.Scoreboard;
1416

17+
import vg.civcraft.mc.civmodcore.CivModCorePlugin;
18+
1519
public class CivScoreBoard {
1620

1721
private String scoreName;
1822
private Map<UUID, String> currentScoreText;
19-
private static final String title = " Info ";
23+
private static final String TITLE = " Info ";
24+
private BukkitRunnable updater;
2025

2126
CivScoreBoard(String scoreName) {
2227
this.scoreName = scoreName;
2328
this.currentScoreText = new TreeMap<>();
2429
}
25-
30+
2631
public String getName() {
2732
return scoreName;
2833
}
2934

30-
public void set(Player p, String text) {
35+
public void updatePeriodically(BiFunction<Player, String, String> updateFunction, long delay) {
36+
if (updater != null) {
37+
updater.cancel();
38+
}
39+
updater = new BukkitRunnable() {
40+
41+
@Override
42+
public void run() {
43+
for (Entry<UUID, String> entry : currentScoreText.entrySet()) {
44+
Player player = Bukkit.getPlayer(entry.getKey());
45+
if (player != null) {
46+
String newText = updateFunction.apply(player, entry.getValue());
47+
if (!newText.equals(entry.getValue())) {
48+
internalUpdate(player, entry.getValue(), newText);
49+
entry.setValue(newText);
50+
}
51+
}
52+
}
53+
}
54+
};
55+
updater.runTaskTimer(CivModCorePlugin.getInstance(), delay, delay);
56+
}
57+
58+
public void set(Player p, String newText) {
3159
String oldText = get(p);
60+
internalUpdate(p, oldText, newText);
61+
currentScoreText.put(p.getUniqueId(), newText);
62+
}
63+
64+
private void internalUpdate(Player p, String oldText, String newText) {
3265
if (oldText != null) {
3366
p.getScoreboard().resetScores(oldText);
34-
}
35-
else {
67+
} else {
3668
ScoreBoardAPI.adjustScore(p.getUniqueId(), 1);
3769
}
38-
Score score = getObjective(p).getScore(text);
70+
Score score = getObjective(p).getScore(newText);
3971
score.setScore(0);
40-
currentScoreText.put(p.getUniqueId(), text);
4172
}
4273

4374
public String get(Player p) {
@@ -53,9 +84,9 @@ public void hide(Player p) {
5384
currentScoreText.remove(p.getUniqueId());
5485
ScoreBoardAPI.adjustScore(p.getUniqueId(), -1);
5586
}
56-
87+
5788
void tearDown() {
58-
for(Entry<UUID,String> entry : currentScoreText.entrySet()) {
89+
for (Entry<UUID, String> entry : currentScoreText.entrySet()) {
5990
Player p = Bukkit.getPlayer(entry.getKey());
6091
if (p == null) {
6192
continue;
@@ -64,18 +95,18 @@ void tearDown() {
6495
}
6596
currentScoreText.clear();
6697
}
67-
98+
6899
void purge(Player p) {
69100
currentScoreText.remove(p.getUniqueId());
70101
}
71102

72103
private Objective getObjective(Player p) {
73104
Scoreboard scb = p.getScoreboard();
74-
Objective objective = scb.getObjective(title);
105+
Objective objective = scb.getObjective(TITLE);
75106
if (objective == null) {
76-
scb.getObjectives().forEach(o -> o.unregister());
107+
scb.getObjectives().forEach(Objective::unregister);
77108
scb.clearSlot(DisplaySlot.SIDEBAR);
78-
objective = scb.registerNewObjective(title, "dummy");
109+
objective = scb.registerNewObjective(TITLE, "dummy", TITLE);
79110
objective.setDisplaySlot(DisplaySlot.SIDEBAR);
80111
}
81112
return objective;

src/main/java/vg/civcraft/mc/civmodcore/scoreboard/ScoreBoardAPI.java renamed to src/main/java/vg/civcraft/mc/civmodcore/scoreboard/side/ScoreBoardAPI.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package vg.civcraft.mc.civmodcore.scoreboard;
1+
package vg.civcraft.mc.civmodcore.scoreboard.side;
22

33
import java.util.HashMap;
44
import java.util.Map;

src/main/java/vg/civcraft/mc/civmodcore/scoreboard/ScoreBoardListener.java renamed to src/main/java/vg/civcraft/mc/civmodcore/scoreboard/side/ScoreBoardListener.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package vg.civcraft.mc.civmodcore.scoreboard;
1+
package vg.civcraft.mc.civmodcore.scoreboard.side;
22

33
import org.bukkit.Bukkit;
44
import org.bukkit.event.EventHandler;

0 commit comments

Comments
 (0)