Skip to content

Commit c31fd9b

Browse files
committed
Add NoFall command
1 parent 8648aab commit c31fd9b

File tree

3 files changed

+107
-1
lines changed

3 files changed

+107
-1
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, Spectate, Speed, Suicide, TpChunk
13+
ClientLocale, DimensionTravel, Feed, Heal, Ip, IpGroup, NoFall, Ping, PlayerChunkTickets, Spectate, Speed, Suicide, TpChunk
1414
).forEach { cmd -> registerFeature(cmd) }
1515
}
1616

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package io.github.rothes.esu.bukkit.module.essentialcommands
2+
3+
import io.github.rothes.esu.bukkit.user
4+
import io.github.rothes.esu.bukkit.util.ComponentBukkitUtils.player
5+
import io.github.rothes.esu.bukkit.util.extension.ListenerExt.register
6+
import io.github.rothes.esu.bukkit.util.extension.ListenerExt.unregister
7+
import io.github.rothes.esu.core.configuration.data.MessageData
8+
import io.github.rothes.esu.core.configuration.data.MessageData.Companion.message
9+
import io.github.rothes.esu.core.module.configuration.FeatureToggle
10+
import io.github.rothes.esu.core.user.User
11+
import org.bukkit.entity.Player
12+
import org.bukkit.event.EventHandler
13+
import org.bukkit.event.Listener
14+
import org.bukkit.event.entity.EntityDamageEvent
15+
import org.bukkit.event.player.PlayerQuitEvent
16+
import java.util.concurrent.ConcurrentHashMap
17+
18+
object NoFall : PlayerOptionalCommand<FeatureToggle.DefaultTrue, NoFall.Lang>() {
19+
20+
private val players = ConcurrentHashMap.newKeySet<Player>()
21+
22+
override fun onEnable() {
23+
super.onEnable()
24+
Listeners.register()
25+
}
26+
27+
override fun onDisable() {
28+
super.onDisable()
29+
Listeners.unregister()
30+
players.clear()
31+
}
32+
33+
override fun onPerform(sender: User, player: Player, silent: Boolean) {
34+
if (players.add(player)) {
35+
sender.message(lang, { enabledForPlayer }, player(player))
36+
if (!silent)
37+
player.user.message(lang, { enabled })
38+
} else {
39+
players.remove(player)
40+
sender.message(lang, { disabledForPlayer }, player(player))
41+
if (!silent)
42+
player.user.message(lang, { disabled })
43+
}
44+
}
45+
46+
private object Listeners: Listener {
47+
@EventHandler
48+
fun onFallDamage(e: EntityDamageEvent) {
49+
if (e.cause == EntityDamageEvent.DamageCause.FALL && players.contains(e.entity)) {
50+
e.isCancelled = true
51+
}
52+
}
53+
54+
@EventHandler
55+
fun onQuit(e: PlayerQuitEvent) {
56+
players.remove(e.player)
57+
}
58+
}
59+
60+
data class Lang(
61+
val enabledForPlayer: MessageData = "<vpc>Enabled <pc>no fall for <pdc><player><pc>.".message,
62+
val disabledForPlayer: MessageData = "<vnc>Disabled <pc>no fall for <pdc><player><pc>.".message,
63+
val enabled: MessageData = "<pc>You no longer receives fall damage.".message,
64+
val disabled: MessageData = "<pc>You are now receiving fall damage.".message,
65+
)
66+
67+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
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.core.user.User
5+
import org.bukkit.entity.Player
6+
import org.incendo.cloud.bukkit.parser.PlayerParser
7+
import org.incendo.cloud.kotlin.extension.commandBuilder
8+
9+
abstract class PlayerOptionalCommand<C, L>: BaseCommand<C, L>() {
10+
11+
override fun onEnable() {
12+
withCommandManager {
13+
commandBuilder(name) {
14+
copy {
15+
permission(cmdShortPerm())
16+
senderType(PlayerUser::class.java)
17+
handler { ctx ->
18+
val sender = ctx.sender() as PlayerUser
19+
onPerform(sender, sender.player, true)
20+
}
21+
regCmd()
22+
}
23+
permission(cmdShortPerm("other"))
24+
required("player", PlayerParser.playerParser())
25+
flag("silent")
26+
handler { ctx ->
27+
val sender = ctx.sender()
28+
val player = ctx.get<Player>("player")
29+
val silent = ctx.flags().isPresent("silent")
30+
onPerform(sender, player, silent || sender is PlayerUser && sender.player == player)
31+
}
32+
regCmd()
33+
}
34+
}
35+
}
36+
37+
abstract fun onPerform(sender: User, player: Player, silent: Boolean)
38+
39+
}

0 commit comments

Comments
 (0)