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