Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
14 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,6 @@ org.jetbrains.dokka.experimental.gradle.pluginMode=V2Enabled
javaVersion=25
mcVersion=26.1.2
group=dev.slne.surf.api
version=3.15.0
version=3.16.0
relocationPrefix=dev.slne.surf.api.libs
snapshot=false
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package dev.slne.surf.api.paper.nms.common

import dev.slne.surf.api.paper.nms.NmsUseWithCaution
import dev.slne.surf.api.paper.packet.listener.listener.PacketListener
import java.util.*
import java.util.concurrent.ConcurrentHashMap

@OptIn(NmsUseWithCaution::class)
abstract class CommandSendPacketBlockerListener(protected val blockedPlayers: Set<UUID>) : PacketListener {
protected val receivedFirstCommandPacket: MutableSet<UUID> = ConcurrentHashMap.newKeySet()

fun removeReceivedFirstCommandPacket(uuid: UUID) {
receivedFirstCommandPacket.remove(uuid)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import dev.slne.surf.api.shared.internal.nms.NmsVersion
import org.bukkit.plugin.java.JavaPlugin
import java.io.File
import java.net.URI
import java.util.*
import java.util.jar.JarFile

/**
Expand Down Expand Up @@ -84,6 +85,8 @@ interface NmsProvider {
fun createChannelInjector(): AbstractChannelInjector<*>
fun createPacketListenerApi(): InternalPacketListenerApiBridge

fun createCommandSendPacketBlockerListener(blockedPlayers: Set<UUID>): CommandSendPacketBlockerListener

/**
* Creates version-specific packet listeners (e.g. lore handler, glowing handler).
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import dev.slne.surf.api.paper.server.nms.v1_21_11.bridges.packets.player.V1_21_
import dev.slne.surf.api.paper.server.nms.v1_21_11.glow.V1_21_11GlowingLifecycleHandler
import dev.slne.surf.api.paper.server.nms.v1_21_11.glow.V1_21_11SurfGlowingApiImpl
import dev.slne.surf.api.paper.server.nms.v1_21_11.packet.listener.V1_21_11ChannelInjector
import dev.slne.surf.api.paper.server.nms.v1_21_11.packet.listener.V1_21_11CommandSendPacketBlockerListenerImpl
import dev.slne.surf.api.paper.server.nms.v1_21_11.packet.listener.V1_21_11GlowingPacketListener
import dev.slne.surf.api.paper.server.nms.v1_21_11.packet.lore.V1_21_11PacketLoreListener
import dev.slne.surf.api.paper.server.nms.v1_21_11.packet.lore.V1_21_11PacketLoreRegistry
Expand All @@ -30,6 +31,7 @@ import dev.slne.surf.api.paper.server.nms.v1_21_11.region.V1_21_11TickThreadGuar
import dev.slne.surf.api.shared.internal.nms.NmsProviderMarker
import dev.slne.surf.api.shared.internal.nms.NmsVersion
import org.bukkit.plugin.java.JavaPlugin
import java.util.*

@Suppress("ClassName")
@OptIn(NmsUseWithCaution::class)
Expand Down Expand Up @@ -89,6 +91,10 @@ class V1_21_11NmsProvider(override val plugin: JavaPlugin) : NmsProvider {
override fun createChannelInjector(): AbstractChannelInjector<*> = V1_21_11ChannelInjector
override fun createPacketListenerApi(): InternalPacketListenerApiBridge = V1_21_11PacketListenerApiImpl()

override fun createCommandSendPacketBlockerListener(blockedPlayers: Set<UUID>): CommandSendPacketBlockerListener {
return V1_21_11CommandSendPacketBlockerListenerImpl(blockedPlayers)
}

override fun createPacketListeners(): List<PacketListener> = listOf(
V1_21_11PacketLoreListener,
V1_21_11GlowingPacketListener,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package dev.slne.surf.api.paper.server.nms.v1_21_11.packet.listener

import com.mojang.brigadier.CommandDispatcher
import com.mojang.brigadier.builder.LiteralArgumentBuilder
import com.mojang.brigadier.tree.ArgumentCommandNode
import com.mojang.brigadier.tree.CommandNode
import dev.slne.surf.api.paper.nms.NmsUseWithCaution
import dev.slne.surf.api.paper.nms.common.CommandSendPacketBlockerListener
import dev.slne.surf.api.paper.packet.listener.listener.annotation.ClientboundListener
import net.minecraft.commands.CommandSourceStack
import net.minecraft.network.protocol.game.ClientboundCommandsPacket
import net.minecraft.resources.Identifier
import net.minecraft.server.level.ServerPlayer
import java.util.*

@OptIn(NmsUseWithCaution::class)
@Suppress("ClassName")
class V1_21_11CommandSendPacketBlockerListenerImpl(blockedPlayers: Set<UUID>) :
CommandSendPacketBlockerListener(blockedPlayers) {

private val loadingCommandsDispatcher = CommandDispatcher<CommandSourceStack>()
private val commandNodeInspector = object : ClientboundCommandsPacket.NodeInspector<CommandSourceStack> {
override fun suggestionId(p0: ArgumentCommandNode<CommandSourceStack, *>): Identifier? {
return null
}

override fun isExecutable(p0: CommandNode<CommandSourceStack>): Boolean {
return false
}

override fun isRestricted(p0: CommandNode<CommandSourceStack>): Boolean {
return false
}
}

init {
loadingCommandsDispatcher.register(LiteralArgumentBuilder.literal("commands-are-loading"))
}

@ClientboundListener
fun onClientboundCommandsPacket(
packet: ClientboundCommandsPacket,
player: ServerPlayer
): ClientboundCommandsPacket? {
if (blockedPlayers.contains(player.uuid)) {
return if (receivedFirstCommandPacket.add(player.uuid)) {
ClientboundCommandsPacket(loadingCommandsDispatcher.root, commandNodeInspector)
} else {
null
}
}

return packet
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import dev.slne.surf.api.paper.server.nms.v26_1.bridges.packets.player.V26_1Surf
import dev.slne.surf.api.paper.server.nms.v26_1.glow.V26_1GlowingLifecycleHandler
import dev.slne.surf.api.paper.server.nms.v26_1.glow.V26_1SurfGlowingApiImpl
import dev.slne.surf.api.paper.server.nms.v26_1.packet.listener.V26_1ChannelInjector
import dev.slne.surf.api.paper.server.nms.v26_1.packet.listener.V26_1CommandSendPacketBlockerListenerImpl
import dev.slne.surf.api.paper.server.nms.v26_1.packet.listener.V26_1GlowingPacketListener
import dev.slne.surf.api.paper.server.nms.v26_1.packet.lore.V26_1PacketLoreListener
import dev.slne.surf.api.paper.server.nms.v26_1.packet.lore.V26_1PacketLoreRegistry
Expand All @@ -30,6 +31,7 @@ import dev.slne.surf.api.paper.server.nms.v26_1.region.V26_1TickThreadGuard
import dev.slne.surf.api.shared.internal.nms.NmsProviderMarker
import dev.slne.surf.api.shared.internal.nms.NmsVersion
import org.bukkit.plugin.java.JavaPlugin
import java.util.*

@Suppress("ClassName")
@OptIn(NmsUseWithCaution::class)
Expand Down Expand Up @@ -68,6 +70,10 @@ class V26_1NmsProvider(override val plugin: JavaPlugin) : NmsProvider {
override fun createChannelInjector(): AbstractChannelInjector<*> = V26_1ChannelInjector
override fun createPacketListenerApi(): InternalPacketListenerApiBridge = V26_1PacketListenerApiImpl()

override fun createCommandSendPacketBlockerListener(blockedPlayers: Set<UUID>): CommandSendPacketBlockerListener {
return V26_1CommandSendPacketBlockerListenerImpl(blockedPlayers)
}

override fun createPacketListeners(): List<PacketListener> = listOf(
V26_1PacketLoreListener,
V26_1GlowingPacketListener,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package dev.slne.surf.api.paper.server.nms.v26_1.packet.listener

import com.mojang.brigadier.CommandDispatcher
import com.mojang.brigadier.builder.LiteralArgumentBuilder
import com.mojang.brigadier.tree.ArgumentCommandNode
import com.mojang.brigadier.tree.CommandNode
import dev.slne.surf.api.paper.nms.NmsUseWithCaution
import dev.slne.surf.api.paper.nms.common.CommandSendPacketBlockerListener
import dev.slne.surf.api.paper.packet.listener.listener.annotation.ClientboundListener
import net.minecraft.commands.CommandSourceStack
import net.minecraft.network.protocol.game.ClientboundCommandsPacket
import net.minecraft.resources.Identifier
import net.minecraft.server.level.ServerPlayer
import java.util.*


@Suppress("ClassName")
@OptIn(NmsUseWithCaution::class)
class V26_1CommandSendPacketBlockerListenerImpl(blockedPlayers: Set<UUID>) :
CommandSendPacketBlockerListener(blockedPlayers) {

private val loadingCommandsDispatcher = CommandDispatcher<CommandSourceStack>()
private val commandNodeInspector = object : ClientboundCommandsPacket.NodeInspector<CommandSourceStack> {
override fun suggestionId(p0: ArgumentCommandNode<CommandSourceStack, *>): Identifier? {
return null
}

override fun isExecutable(p0: CommandNode<CommandSourceStack>): Boolean {
return false
}

override fun isRestricted(p0: CommandNode<CommandSourceStack>): Boolean {
return false
}
}

init {
loadingCommandsDispatcher.register(LiteralArgumentBuilder.literal("commands-are-loading"))
}

@ClientboundListener
fun onClientboundCommandsPacket(
packet: ClientboundCommandsPacket,
player: ServerPlayer
): ClientboundCommandsPacket? {
if (blockedPlayers.contains(player.uuid)) {
return if (receivedFirstCommandPacket.add(player.uuid)) {
ClientboundCommandsPacket(loadingCommandsDispatcher.root, commandNodeInspector)
} else {
null
}
}

return packet
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,8 @@ public SurfApiTestCommand() {
new SignedMessageArgumentTest("signedmessage"),
new BlockPdcContainerTest("blockpdc"),
new OfflineInventoryEditTest("editOfflineInventory"),
new ModernSerializerTestConfigCommand("modernSerializerTestConfig")
new ModernSerializerTestConfigCommand("modernSerializerTestConfig"),
new SuspendRequirementTestCommand("suspendRequirement")
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package dev.slne.surf.surfapi.bukkit.test.command.subcommands

import dev.jorel.commandapi.CommandAPICommand
import dev.jorel.commandapi.kotlindsl.*
import dev.slne.surf.api.paper.command.requirement.withSuspendPlayerRequirement
import kotlinx.coroutines.delay
import java.util.*
import java.util.concurrent.ConcurrentHashMap
import kotlin.time.Duration.Companion.seconds

class SuspendRequirementTestCommand(name: String) : CommandAPICommand(name) {
private val shown = ConcurrentHashMap.newKeySet<UUID>()

init {
subcommand("updateCommands") {
playerExecutor { player, _ ->
player.updateCommands()
}
}

subcommand("showCommand") {
booleanArgument("show")

playerExecutor { player, arguments ->
val show: Boolean by arguments
if (show) {
shown.add(player.uniqueId)
} else {
shown.remove(player.uniqueId)
}
}
}

subcommand("conditionalCommand") {
withSuspendPlayerRequirement { player ->
delay(10.seconds)
player.uniqueId in shown
}

anyExecutor { sender, _ ->
sender.sendMessage("This command is only available to players who have shown it")
}
}
}
}
Loading