Skip to content

Commit 73cff33

Browse files
committed
feat: admin target mode for /display on|off <player>
1 parent 5f93b64 commit 73cff33

File tree

14 files changed

+178
-31
lines changed

14 files changed

+178
-31
lines changed

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ Plugin:
5454
- [x] Add translation for `/display list` command
5555
- [x] Improve `/display video` error feedback (separate invalid URL/not owner/wrong target block)
5656
- [x] Add total value output to `/display stats`
57-
- [ ] Add admin target mode for `/display on|off <player>`
57+
- [x] Add admin target mode for `/display on|off <player>`
5858
- [ ] Improve `/display reload` output with what was reloaded
5959

6060
# Version 1.4.3

spigot/src/main/kotlin/com/dreamdisplays/Config.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,7 @@ class Config(private val plugin: Main) {
221221
val updates get() = permissions.updates
222222
val help get() = permissions.help
223223
val stats get() = permissions.stats
224+
val toggleOthers get() = permissions.toggle_others
224225

225226
data class PermissionsConfig(
226227
val create: String = "dreamdisplays.create",
@@ -233,6 +234,7 @@ class Config(private val plugin: Main) {
233234
val updates: String = "dreamdisplays.updates",
234235
val help: String = "dreamdisplays.help",
235236
val stats: String = "dreamdisplays.stats",
237+
val toggle_others: String = "dreamdisplays.toggle.others",
236238
)
237239
}
238240

Lines changed: 58 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,79 @@
11
package com.dreamdisplays.commands.subcommands
22

3+
import com.dreamdisplays.Main
34
import com.dreamdisplays.managers.PlayerManager.isDisplaysEnabled
45
import com.dreamdisplays.managers.PlayerManager.setDisplaysEnabled
6+
import com.dreamdisplays.utils.Message.sendColoredMessage
57
import com.dreamdisplays.utils.Message.sendMessage
68
import com.dreamdisplays.utils.net.PacketUtils.sendDisplayEnabled
9+
import org.bukkit.Bukkit
710
import org.bukkit.command.CommandSender
811
import org.bukkit.entity.Player
912

1013
class OffCommand : SubCommand {
1114

1215
override val name = "off"
1316
override val permission: String? = null
14-
override val playerOnly = true
17+
override val playerOnly = false
1518

1619
override fun execute(sender: CommandSender, args: Array<String?>) {
17-
val player = (sender as? Player) ?: return
20+
val target = resolveTarget(sender, args) ?: return
21+
val selfTarget = sender is Player && sender.uniqueId == target.uniqueId
1822

19-
if (!isDisplaysEnabled(player)) {
20-
sendMessage(player, "display.already-disabled")
23+
if (!selfTarget && !sender.hasPermission(Main.config.permissions.toggleOthers)) {
24+
sendMessage(sender, "displayCommandMissingPermission")
2125
return
2226
}
2327

24-
setDisplaysEnabled(player, false)
25-
sendDisplayEnabled(player, false)
26-
sendMessage(player, "display.disabled")
28+
if (!isDisplaysEnabled(target)) {
29+
sendMessage(target, "display.already-disabled")
30+
if (!selfTarget) {
31+
sendColoredMessage(sender, format(sender, "display.already-disabled.target", target.name))
32+
}
33+
return
34+
}
35+
36+
setDisplaysEnabled(target, false)
37+
sendDisplayEnabled(target, false)
38+
sendMessage(target, "display.disabled")
39+
if (!selfTarget) {
40+
sendColoredMessage(sender, format(sender, "display.disabled.target", target.name))
41+
}
42+
}
43+
44+
override fun complete(sender: CommandSender, args: Array<String?>): List<String> {
45+
if (args.size != 2) return emptyList()
46+
if (!sender.hasPermission(Main.config.permissions.toggleOthers)) return emptyList()
47+
return Bukkit.getOnlinePlayers().map { it.name }.sorted()
48+
}
49+
50+
private fun resolveTarget(sender: CommandSender, args: Array<String?>): Player? {
51+
if (args.size == 1) {
52+
return sender as? Player ?: run {
53+
sendMessage(sender, "displayWrongCommand")
54+
null
55+
}
56+
}
57+
if (args.size != 2) {
58+
sendMessage(sender, "displayWrongCommand")
59+
return null
60+
}
61+
62+
val targetName = args[1]?.trim().orEmpty()
63+
if (targetName.isBlank()) {
64+
sendMessage(sender, "displayWrongCommand")
65+
return null
66+
}
67+
68+
val target = Bukkit.getPlayerExact(targetName)
69+
if (target != null) return target
70+
71+
sendColoredMessage(sender, format(sender, "displayTargetNotFound", targetName))
72+
return null
73+
}
74+
75+
private fun format(sender: CommandSender, key: String, vararg values: Any): String {
76+
val template = Main.config.getMessageForPlayer(sender as? Player, key) as? String ?: key
77+
return runCatching { String.format(template, *values) }.getOrElse { template }
2778
}
2879
}
Lines changed: 58 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,79 @@
11
package com.dreamdisplays.commands.subcommands
22

3+
import com.dreamdisplays.Main
34
import com.dreamdisplays.managers.PlayerManager.isDisplaysEnabled
45
import com.dreamdisplays.managers.PlayerManager.setDisplaysEnabled
6+
import com.dreamdisplays.utils.Message.sendColoredMessage
57
import com.dreamdisplays.utils.Message.sendMessage
68
import com.dreamdisplays.utils.net.PacketUtils.sendDisplayEnabled
9+
import org.bukkit.Bukkit
710
import org.bukkit.command.CommandSender
811
import org.bukkit.entity.Player
912

1013
class OnCommand : SubCommand {
1114

1215
override val name = "on"
1316
override val permission: String? = null
14-
override val playerOnly = true
17+
override val playerOnly = false
1518

1619
override fun execute(sender: CommandSender, args: Array<String?>) {
17-
val player = (sender as? Player) ?: return
20+
val target = resolveTarget(sender, args) ?: return
21+
val selfTarget = sender is Player && sender.uniqueId == target.uniqueId
1822

19-
if (isDisplaysEnabled(player)) {
20-
sendMessage(player, "display.already-enabled")
23+
if (!selfTarget && !sender.hasPermission(Main.config.permissions.toggleOthers)) {
24+
sendMessage(sender, "displayCommandMissingPermission")
2125
return
2226
}
2327

24-
setDisplaysEnabled(player, true)
25-
sendDisplayEnabled(player, true)
26-
sendMessage(player, "display.enabled")
28+
if (isDisplaysEnabled(target)) {
29+
sendMessage(target, "display.already-enabled")
30+
if (!selfTarget) {
31+
sendColoredMessage(sender, format(sender, "display.already-enabled.target", target.name))
32+
}
33+
return
34+
}
35+
36+
setDisplaysEnabled(target, true)
37+
sendDisplayEnabled(target, true)
38+
sendMessage(target, "display.enabled")
39+
if (!selfTarget) {
40+
sendColoredMessage(sender, format(sender, "display.enabled.target", target.name))
41+
}
42+
}
43+
44+
override fun complete(sender: CommandSender, args: Array<String?>): List<String> {
45+
if (args.size != 2) return emptyList()
46+
if (!sender.hasPermission(Main.config.permissions.toggleOthers)) return emptyList()
47+
return Bukkit.getOnlinePlayers().map { it.name }.sorted()
48+
}
49+
50+
private fun resolveTarget(sender: CommandSender, args: Array<String?>): Player? {
51+
if (args.size == 1) {
52+
return sender as? Player ?: run {
53+
sendMessage(sender, "displayWrongCommand")
54+
null
55+
}
56+
}
57+
if (args.size != 2) {
58+
sendMessage(sender, "displayWrongCommand")
59+
return null
60+
}
61+
62+
val targetName = args[1]?.trim().orEmpty()
63+
if (targetName.isBlank()) {
64+
sendMessage(sender, "displayWrongCommand")
65+
return null
66+
}
67+
68+
val target = Bukkit.getPlayerExact(targetName)
69+
if (target != null) return target
70+
71+
sendColoredMessage(sender, format(sender, "displayTargetNotFound", targetName))
72+
return null
73+
}
74+
75+
private fun format(sender: CommandSender, key: String, vararg values: Any): String {
76+
val template = Main.config.getMessageForPlayer(sender as? Player, key) as? String ?: key
77+
return runCatching { String.format(template, *values) }.getOrElse { template }
2778
}
2879
}

spigot/src/main/resources/assets/dreamdisplays/lang/be.json

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,11 @@
102102
"display.disabled": "&7D |&f Дысплеі адключаны",
103103
"display.already-disabled": "&7D |&f Дысплеі ўжо адключаны",
104104
"display.already-enabled": "&7D |&f Дысплеі ўжо ўключаны",
105+
"displayTargetNotFound": "&7D |&f Гулец '%s' не знойдзены анлайн!",
106+
"display.enabled.target": "&7D |&f Дысплеі ўключаны для %s",
107+
"display.disabled.target": "&7D |&f Дысплеі адключаны для %s",
108+
"display.already-enabled.target": "&7D |&f У %s дысплеі ўжо ўключаны",
109+
"display.already-disabled.target": "&7D |&f У %s дысплеі ўжо адключаны",
105110
"displayStatsHeader": "&7D |&f Статыстыка выкарыстання моду:",
106111
"displayStatsEntry": "&7D |&f Версія %s: %d гульцоў",
107112
"displayStatsTotal": "&7D |&f Усяго гульцоў з модам: %d",
@@ -113,8 +118,8 @@
113118
"displayHelpList": "– /display list: Спіс усіх дысплеяў",
114119
"displayHelpStats": "– /display stats: Пакажыце статыстыку выкарыстання моду",
115120
"displayHelpReload": "– /display reload: Перазагрузіце канфігурацыю",
116-
"displayHelpOn": "– /display on: Уключыце дысплеі",
117-
"displayHelpOff": "– /display off: Адключыце дысплеі",
121+
"displayHelpOn": "– /display on [гулец]: уключыць дысплеі сабе або абранаму гульцу",
122+
"displayHelpOff": "– /display off [гулец]: адключыць дысплеі сабе або абранаму гульцу",
118123
"displayHelpHelp": "– /display help: Пакажыце гэтую даведку",
119124
"displayInfoHeader": "&7D |&f Інфармацыя пра дысплей:",
120125
"displayInfoOwnerLine": "&7D |&7 уладальнік=&f{0} &8| &7uuid=&f{1}",

spigot/src/main/resources/assets/dreamdisplays/lang/cs.json

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,11 @@
102102
"display.disabled": "&7D |&f Displeje zakázány",
103103
"display.already-disabled": "&7D |&f Displeje jsou již zakázány",
104104
"display.already-enabled": "&7D |&f Displeje jsou již povoleny",
105+
"displayTargetNotFound": "&7D |&f Hráč '%s' nebyl online nalezen!",
106+
"display.enabled.target": "&7D |&f Displeje povoleny pro %s",
107+
"display.disabled.target": "&7D |&f Displeje zakázány pro %s",
108+
"display.already-enabled.target": "&7D |&f Displeje jsou pro %s již povoleny",
109+
"display.already-disabled.target": "&7D |&f Displeje jsou pro %s již zakázány",
105110
"displayStatsHeader": "&7D |&f Statistiky používání modu:",
106111
"displayStatsEntry": "&7D |&f Verze %s: %d hráčů",
107112
"displayStatsTotal": "&7D |&f Celkem hráčů s modem: %d",
@@ -113,8 +118,8 @@
113118
"displayHelpList": "– /display list: Seznam všech displejů",
114119
"displayHelpStats": "– /display stats: Zobrazte statistiky používání modu",
115120
"displayHelpReload": "– /display reload: Znovu načtěte konfiguraci",
116-
"displayHelpOn": "– /display on: Povolte displeje",
117-
"displayHelpOff": "– /display off: Zakažte displeje",
121+
"displayHelpOn": "– /display on [hráč]: povolte displeje sobě nebo vybranému hráči",
122+
"displayHelpOff": "– /display off [hráč]: zakažte displeje sobě nebo vybranému hráči",
118123
"displayHelpHelp": "– /display help: Zobrazte tuto nápovědu",
119124
"displayInfoHeader": "&7D |&f Informace o displeji:",
120125
"displayInfoOwnerLine": "&7D |&7 vlastnik=&f{0} &8| &7uuid=&f{1}",

spigot/src/main/resources/assets/dreamdisplays/lang/de.json

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,11 @@
102102
"display.disabled": "&7D |&f Displays deaktiviert",
103103
"display.already-disabled": "&7D |&f Displays sind bereits deaktiviert",
104104
"display.already-enabled": "&7D |&f Displays sind bereits aktiviert",
105+
"displayTargetNotFound": "&7D |&f Spieler '%s' wurde online nicht gefunden!",
106+
"display.enabled.target": "&7D |&f Displays für %s aktiviert",
107+
"display.disabled.target": "&7D |&f Displays für %s deaktiviert",
108+
"display.already-enabled.target": "&7D |&f Displays sind für %s bereits aktiviert",
109+
"display.already-disabled.target": "&7D |&f Displays sind für %s bereits deaktiviert",
105110
"displayStatsHeader": "&7D |&f Mod-Nutzungsstatistiken:",
106111
"displayStatsEntry": "&7D |&f Version %s: %d Spieler",
107112
"displayStatsTotal": "&7D |&f Gesamt Spieler mit Mod: %d",
@@ -113,8 +118,8 @@
113118
"displayHelpList": "– /display list: Liste alle Displays auf",
114119
"displayHelpStats": "– /display stats: Zeige Mod-Nutzungsstatistiken",
115120
"displayHelpReload": "– /display reload: Lade die Konfiguration neu",
116-
"displayHelpOn": "– /display on: Aktiviere Displays",
117-
"displayHelpOff": "– /display off: Deaktiviere Displays",
121+
"displayHelpOn": "– /display on [spieler]: Aktiviere Displays für dich oder einen Zielspieler",
122+
"displayHelpOff": "– /display off [spieler]: Deaktiviere Displays für dich oder einen Zielspieler",
118123
"displayHelpHelp": "– /display help: Zeige diese Hilfe",
119124
"displayInfoHeader": "&7D |&f Display-Informationen:",
120125
"displayInfoOwnerLine": "&7D |&7 besitzer=&f{0} &8| &7uuid=&f{1}",

spigot/src/main/resources/assets/dreamdisplays/lang/en.json

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,11 @@
102102
"display.disabled": "&7D |&f Displays disabled",
103103
"display.already-disabled": "&7D |&f Displays are already disabled",
104104
"display.already-enabled": "&7D |&f Displays are already enabled",
105+
"displayTargetNotFound": "&7D |&f Player '%s' was not found online!",
106+
"display.enabled.target": "&7D |&f Displays enabled for %s",
107+
"display.disabled.target": "&7D |&f Displays disabled for %s",
108+
"display.already-enabled.target": "&7D |&f Displays are already enabled for %s",
109+
"display.already-disabled.target": "&7D |&f Displays are already disabled for %s",
105110
"displayStatsHeader": "&7D |&f Mod usage statistics:",
106111
"displayStatsEntry": "&7D |&f Version %s: %d players",
107112
"displayStatsTotal": "&7D |&f Total players with mod: %d",
@@ -113,8 +118,8 @@
113118
"displayHelpList": "– /display list: list all displays",
114119
"displayHelpStats": "– /display stats: show mod usage statistics",
115120
"displayHelpReload": "– /display reload: reload the configuration",
116-
"displayHelpOn": "– /display on: enable displays",
117-
"displayHelpOff": "– /display off: disable displays",
121+
"displayHelpOn": "– /display on [player]: enable displays for yourself or a target player",
122+
"displayHelpOff": "– /display off [player]: disable displays for yourself or a target player",
118123
"displayHelpHelp": "– /display help: show this help",
119124
"displayInfoHeader": "&7D |&f Display info:",
120125
"displayInfoOwnerLine": "&7D |&7 owner=&f{0} &8| &7uuid=&f{1}",

spigot/src/main/resources/assets/dreamdisplays/lang/he.json

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,11 @@
102102
"display.disabled": "&7D |&f תצוגות מושבתות",
103103
"display.already-disabled": "&7D |&f התצוגות כבר מושבתות",
104104
"display.already-enabled": "&7D |&f התצוגות כבר מופעלות",
105+
"displayTargetNotFound": "&7D |&f השחקן '%s' לא נמצא אונליין!",
106+
"display.enabled.target": "&7D |&f התצוגות הופעלו עבור %s",
107+
"display.disabled.target": "&7D |&f התצוגות הושבתו עבור %s",
108+
"display.already-enabled.target": "&7D |&f התצוגות כבר מופעלות עבור %s",
109+
"display.already-disabled.target": "&7D |&f התצוגות כבר מושבתות עבור %s",
105110
"displayStatsHeader": "&7D |&f סטטיסטיקות שימוש במוד:",
106111
"displayStatsEntry": "&7D |&f גרסה %s: %d שחקנים",
107112
"displayStatsTotal": "&7D |&f סה\"כ שחקנים עם מוד: %d",
@@ -113,8 +118,8 @@
113118
"displayHelpList": "– /display list: רשום את כל התצוגות",
114119
"displayHelpStats": "– /display stats: הצג סטטיסטיקות שימוש במוד",
115120
"displayHelpReload": "– /display reload: טען מחדש את התצורה",
116-
"displayHelpOn": "– /display on: הפעל תצוגות",
117-
"displayHelpOff": "– /display off: השבת תצוגות",
121+
"displayHelpOn": "– /display on [player]: הפעל תצוגות לעצמך או לשחקן יעד",
122+
"displayHelpOff": "– /display off [player]: השבת תצוגות לעצמך או לשחקן יעד",
118123
"displayHelpHelp": "– /display help: הצג עזרה זו",
119124
"displayInfoHeader": "&7D |&f מידע על התצוגה:",
120125
"displayInfoOwnerLine": "&7D |&7 בעלים=&f{0} &8| &7uuid=&f{1}",

spigot/src/main/resources/assets/dreamdisplays/lang/pl.json

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,11 @@
9999
"display.disabled": "&7D |&f Wyświetlacze wyłączone",
100100
"display.already-disabled": "&7D |&f Wyświetlacze są już wyłączone",
101101
"display.already-enabled": "&7D |&f Wyświetlacze są już włączone",
102+
"displayTargetNotFound": "&7D |&f Gracz '%s' nie został znaleziony online!",
103+
"display.enabled.target": "&7D |&f Wyświetlacze włączone dla %s",
104+
"display.disabled.target": "&7D |&f Wyświetlacze wyłączone dla %s",
105+
"display.already-enabled.target": "&7D |&f Wyświetlacze są już włączone dla %s",
106+
"display.already-disabled.target": "&7D |&f Wyświetlacze są już wyłączone dla %s",
102107
"displayWrongCommand": "&7D |&f Wprowadziłeś coś nieprawidłowego!",
103108
"displayCommandMissingPermission": "&7D |&f Nie masz uprawnień do użycia tego polecenia!",
104109
"commandPlayersOnly": "&7D |&f Tego polecenia może użyć tylko gracz w grze",
@@ -113,8 +118,8 @@
113118
"displayHelpList": "– /display list: lista wszystkich wyświetlaczy",
114119
"displayHelpStats": "– /display stats: pokaż statystyki użycia modu",
115120
"displayHelpReload": "– /display reload: przeładuj konfigurację",
116-
"displayHelpOn": "– /display on: włącz wyświetlacze",
117-
"displayHelpOff": "– /display off: wyłącz wyświetlacze",
121+
"displayHelpOn": "– /display on [gracz]: włącz wyświetlacze sobie lub wybranemu graczowi",
122+
"displayHelpOff": "– /display off [gracz]: wyłącz wyświetlacze sobie lub wybranemu graczowi",
118123
"displayHelpHelp": "– /display help: pokaż tę pomoc",
119124
"displayInfoHeader": "&7D |&f Informacje o wyświetlaczu:",
120125
"displayInfoOwnerLine": "&7D |&7 właściciel=&f{0} &8| &7uuid=&f{1}",

0 commit comments

Comments
 (0)