Skip to content

Commit b0cd7b4

Browse files
committed
Add Spectate command
1 parent 8dc1dbc commit b0cd7b4

File tree

3 files changed

+63
-2
lines changed

3 files changed

+63
-2
lines changed

bukkit/src/main/kotlin/io/github/rothes/esu/bukkit/module/EssentialCommandsModule.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ object EssentialCommandsModule: BukkitModule<BaseModuleConfiguration, EssentialC
1010

1111
init {
1212
listOf(
13-
ClientLocale, DimensionTravel, Feed, Heal, Ip, IpGroup, Ping, PlayerChunkTickets, Speed, Suicide, TpChunk
13+
ClientLocale, DimensionTravel, Feed, Heal, Ip, IpGroup, Ping, PlayerChunkTickets, Spectate, Speed, Suicide, TpChunk
1414
).forEach { cmd -> registerFeature(cmd) }
1515
}
1616

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package io.github.rothes.esu.bukkit.module.essentialcommands
2+
3+
import io.github.rothes.esu.bukkit.user.PlayerUser
4+
import io.github.rothes.esu.bukkit.util.ComponentBukkitUtils.player
5+
import io.github.rothes.esu.bukkit.util.ServerCompatibility.tp
6+
import io.github.rothes.esu.bukkit.util.scheduler.Scheduler.nextTick
7+
import io.github.rothes.esu.bukkit.util.scheduler.Scheduler.nextTickDeferred
8+
import io.github.rothes.esu.bukkit.util.version.adapter.TickThreadAdapter.Companion.checkTickThread
9+
import io.github.rothes.esu.core.command.annotation.ShortPerm
10+
import io.github.rothes.esu.core.configuration.data.MessageData
11+
import io.github.rothes.esu.core.configuration.data.MessageData.Companion.message
12+
import io.github.rothes.esu.core.module.configuration.FeatureToggle
13+
import org.bukkit.GameMode
14+
import org.bukkit.entity.Player
15+
import org.incendo.cloud.annotations.Argument
16+
import org.incendo.cloud.annotations.Command
17+
18+
object Spectate: BaseCommand<FeatureToggle.DefaultTrue, Spectate.Lang>() {
19+
20+
override fun onEnable() {
21+
registerCommands(object {
22+
@Command("spectate <target>")
23+
@ShortPerm
24+
suspend fun spectate(sender: PlayerUser, @Argument("target") target: Player) {
25+
val caller = sender.player
26+
if (caller == target) {
27+
return sender.message(lang, { cannotSpectateSelf })
28+
}
29+
if (caller.gameMode != GameMode.SPECTATOR) {
30+
caller.nextTickDeferred {
31+
caller.gameMode = GameMode.SPECTATOR
32+
}.join()
33+
}
34+
target.nextTick {
35+
if (caller.checkTickThread())
36+
caller.spectatorTarget = target
37+
else {
38+
caller.tp(target.location) {
39+
caller.spectatorTarget = target
40+
}
41+
}
42+
sender.message(lang, { spectatingTarget }, player(target, "target"))
43+
}
44+
}
45+
}) { parser ->
46+
parser.registerBuilderDecorator {
47+
it.senderType(PlayerUser::class.java)
48+
}
49+
}
50+
}
51+
52+
data class Lang(
53+
val cannotSpectateSelf: MessageData = "<ec>You cannot spectate yourself!".message,
54+
val spectatingTarget: MessageData = "<pc>Spectating <pdc><target></pdc> now.".message,
55+
)
56+
57+
}

bukkit/src/main/kotlin/io/github/rothes/esu/bukkit/util/scheduler/Scheduler.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,14 +108,18 @@ object Scheduler {
108108
BukkitTask(Bukkit.getScheduler().runTaskTimerAsynchronously(plugin, func, delayTicks, periodTicks))
109109
}
110110

111-
fun <T> Entity.nextTick(plugin: Plugin = esuPlugin, func: () -> T): CompletableDeferred<T> {
111+
fun <T> Entity.nextTickDeferred(plugin: Plugin = esuPlugin, func: () -> T): CompletableDeferred<T> {
112112
val deferred = CompletableDeferred<T>()
113113
schedule(this, plugin) {
114114
deferred.complete(func())
115115
} ?: error("Failed to schedule task")
116116
return deferred
117117
}
118118

119+
fun Entity.nextTick(plugin: Plugin = esuPlugin, func: () -> Unit): ScheduledTask? {
120+
return schedule(this, plugin, func)
121+
}
122+
119123
fun cancelTasks(plugin: Plugin = esuPlugin) {
120124
if (isFolia) {
121125
Bukkit.getGlobalRegionScheduler().cancelTasks(plugin)

0 commit comments

Comments
 (0)