Skip to content

Commit 115971d

Browse files
committed
feat: simplescoreboard
1 parent 52b8001 commit 115971d

File tree

1 file changed

+87
-0
lines changed

1 file changed

+87
-0
lines changed
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package cc.modlabs.kpaper.scoreboard
2+
3+
import com.google.common.base.Preconditions
4+
import com.google.common.base.Splitter
5+
import com.google.common.collect.Lists
6+
import com.google.common.collect.Maps
7+
import dev.fruxz.stacked.text
8+
import org.bukkit.Bukkit
9+
import org.bukkit.entity.Player
10+
import org.bukkit.scoreboard.Criteria
11+
import org.bukkit.scoreboard.DisplaySlot
12+
import org.bukkit.scoreboard.Scoreboard
13+
import org.bukkit.scoreboard.Team
14+
import java.util.*
15+
16+
17+
class SimpleScoreboard(private var title: String?) {
18+
private val scoreboard: Scoreboard
19+
20+
private val scores: MutableMap<String, Int>
21+
private val teams: MutableList<Team>
22+
23+
init {
24+
this.scoreboard = Bukkit.getScoreboardManager().newScoreboard
25+
this.scores = Maps.newLinkedHashMap()
26+
this.teams = Lists.newArrayList()
27+
}
28+
29+
fun blankLine() {
30+
add(" ")
31+
}
32+
33+
@JvmOverloads
34+
fun add(text: String, score: Int? = null) {
35+
var textData = text
36+
Preconditions.checkArgument(textData.length < 48, "text cannot be over 48 characters in length")
37+
textData = fixDuplicates(textData)
38+
scores[textData] = score!!
39+
}
40+
41+
private fun fixDuplicates(text: String): String {
42+
var textData = text
43+
while (scores.containsKey(textData)) textData += "§r"
44+
if (textData.length > 48) textData = textData.substring(0, 47)
45+
return textData
46+
}
47+
48+
private fun createTeam(text: String): Map.Entry<Team?, String> {
49+
val result: String
50+
if (text.length <= 16) return AbstractMap.SimpleEntry<Team?, String>(null, text)
51+
val team = scoreboard.registerNewTeam("text-" + scoreboard.teams.size)
52+
val iterator: Iterator<String> = Splitter.fixedLength(16).split(text).iterator()
53+
team.prefix(text(iterator.next()))
54+
result = iterator.next()
55+
if (text.length > 32) team.suffix(text(iterator.next()))
56+
teams.add(team)
57+
return AbstractMap.SimpleEntry(team, result)
58+
}
59+
60+
fun build() {
61+
val obj =
62+
scoreboard.registerNewObjective(((if (title!!.length > 16) title!!.substring(0, 15) else title)!!), Criteria.DUMMY, text(title!!))
63+
obj.displayName(text(title!!))
64+
obj.displaySlot = DisplaySlot.SIDEBAR
65+
66+
var index = scores.size
67+
68+
for ((key, value) in scores) {
69+
val team = createTeam(key)
70+
val player = Bukkit.getOfflinePlayer(team.value)
71+
if (team.key != null) team.key!!.addPlayer(player)
72+
obj.getScore(player).score = value
73+
index -= 1
74+
}
75+
}
76+
77+
fun reset() {
78+
title = null
79+
scores.clear()
80+
for (t in teams) t.unregister()
81+
teams.clear()
82+
}
83+
84+
fun send(vararg players: Player) {
85+
for (p in players) p.scoreboard = scoreboard
86+
}
87+
}

0 commit comments

Comments
 (0)