Skip to content

Commit

Permalink
Update and apply ktlint
Browse files Browse the repository at this point in the history
  • Loading branch information
Aeltumn committed Jan 6, 2025
1 parent b4046d3 commit 8c5c1f3
Show file tree
Hide file tree
Showing 19 changed files with 288 additions and 171 deletions.
2 changes: 1 addition & 1 deletion paper/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ java {

configure<SpotlessExtension> {
kotlin {
ktlint("0.48.2")
ktlint("1.5.0")
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ public abstract class BaseNoxesiumListener(
public val logger: Logger,
public val manager: NoxesiumManager,
) : Listener {

public companion object {
/** Base namespace of the plugin channel for Noxesium messages. */
public const val NOXESIUM_NAMESPACE: String = "noxesium"
Expand All @@ -39,7 +38,10 @@ public abstract class BaseNoxesiumListener(
* Defines a plugin message [listener] that will be registered and unregistered with
* this listener.
*/
protected fun registerIncomingPluginChannel(channel: Key, listener: PluginMessageListener) {
protected fun registerIncomingPluginChannel(
channel: Key,
listener: PluginMessageListener,
) {
incomingPluginChannels[channel] = listener
if (registered.get()) {
plugin.server.messenger.registerIncomingPluginChannel(plugin, channel.asString(), listener)
Expand Down Expand Up @@ -83,28 +85,44 @@ public abstract class BaseNoxesiumListener(
}

/** Creates this packet for the given [player]. */
public abstract fun createPacket(player: Player, packet: NoxesiumPacket): ClientboundCustomPayloadPacket?
public abstract fun createPacket(
player: Player,
packet: NoxesiumPacket,
): ClientboundCustomPayloadPacket?
}

/** Sends a plugin message to a player. */
public fun Player.createPayloadPacket(channel: Key, initialCapacity: Int? = null, writer: (buffer: RegistryFriendlyByteBuf) -> Unit): ClientboundCustomPayloadPacket? {
public fun Player.createPayloadPacket(
channel: Key,
initialCapacity: Int? = null,
writer: (buffer: RegistryFriendlyByteBuf) -> Unit,
): ClientboundCustomPayloadPacket? {
val craftPlayer = this as CraftPlayer
if (craftPlayer.handle.connection == null) return null
if (channel.asString() in craftPlayer.listeningPluginChannels) {
return ClientboundCustomPayloadPacket(
DiscardedPayload(
ResourceLocation.parse(StandardMessenger.validateAndCorrectChannel(channel.asString())),
// We have to do this custom so we can re-use the byte buf otherwise it gets padded with 0's!
RegistryFriendlyByteBuf(initialCapacity?.let(Unpooled::buffer) ?: Unpooled.buffer(), (Bukkit.getServer() as CraftServer).handle.server.registryAccess()).apply(writer),
RegistryFriendlyByteBuf(
initialCapacity?.let(Unpooled::buffer) ?: Unpooled.buffer(),
(Bukkit.getServer() as CraftServer).handle.server.registryAccess(),
).apply(writer),
),
)
}
Bukkit.getLogger().warning("Couldn't create packet of type $channel for player $name as they have not yet registered the required plugin channel")
Bukkit.getLogger().warning(
"Couldn't create packet of type $channel for player $name as they have not yet registered the required plugin channel",
)
return null
}

/** Sends a plugin message to a player. */
public fun Player.sendPluginMessage(channel: Key, initialCapacity: Int? = null, writer: (buffer: RegistryFriendlyByteBuf) -> Unit) {
public fun Player.sendPluginMessage(
channel: Key,
initialCapacity: Int? = null,
writer: (buffer: RegistryFriendlyByteBuf) -> Unit,
) {
val packet = createPayloadPacket(channel, initialCapacity, writer)
if (packet != null) {
val craftPlayer = this as CraftPlayer
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,9 @@ import java.util.WeakHashMap
* fake entity system where we send all entities entirely through packets and manage
* them custom, hence we do not need a system such as this.
*/
public class EntityRuleManager(private val manager: NoxesiumManager) : Listener {

public class EntityRuleManager(
private val manager: NoxesiumManager,
) : Listener {
private val entities = WeakHashMap<Entity, RuleHolder>()
private var task: Int = -1

Expand All @@ -35,34 +36,35 @@ public class EntityRuleManager(private val manager: NoxesiumManager) : Listener
Bukkit.getPluginManager().registerEvents(this, manager.plugin)

// Send rule updates once a tick in a batch
task = Bukkit.getScheduler().scheduleSyncRepeatingTask(manager.plugin, {
for ((entity, holder) in entities) {
if (!holder.needsUpdate) continue
task =
Bukkit.getScheduler().scheduleSyncRepeatingTask(manager.plugin, {
for ((entity, holder) in entities) {
if (!holder.needsUpdate) continue

// Send the packet to all players that can see it
for (player in Bukkit.getOnlinePlayers()) {
if (!player.canSee(entity)) continue
manager.sendPacket(
player,
ClientboundSetExtraEntityDataPacket(
entity.entityId,
holder.rules
// Only include rules that need to be updated!
.filter { it.value.changePending }
// Only include rules that are available to this player!
.filter { manager.entityRules.isAvailable(it.key, manager.getProtocolVersion(player) ?: -1) }
.ifEmpty { null }
?.mapValues { (_, rule) ->
{ buffer -> (rule as RemoteServerRule<Any>).write(rule.value, buffer) }
} ?: continue,
),
)
}
// Send the packet to all players that can see it
for (player in Bukkit.getOnlinePlayers()) {
if (!player.canSee(entity)) continue
manager.sendPacket(
player,
ClientboundSetExtraEntityDataPacket(
entity.entityId,
holder.rules
// Only include rules that need to be updated!
.filter { it.value.changePending }
// Only include rules that are available to this player!
.filter { manager.entityRules.isAvailable(it.key, manager.getProtocolVersion(player) ?: -1) }
.ifEmpty { null }
?.mapValues { (_, rule) ->
{ buffer -> (rule as RemoteServerRule<Any>).write(rule.value, buffer) }
} ?: continue,
),
)
}

// Mark as updated after we have used the changePending values!
holder.markAllUpdated()
}
}, 1, 1)
// Mark as updated after we have used the changePending values!
holder.markAllUpdated()
}
}, 1, 1)
}

/**
Expand All @@ -74,11 +76,16 @@ public class EntityRuleManager(private val manager: NoxesiumManager) : Listener
}

/** Returns the given [rule] for [entity]. */
public fun <T : Any> getEntityRule(entity: Entity, rule: RuleFunction<T>): RemoteServerRule<T>? =
getEntityRule(entity, rule.index)
public fun <T : Any> getEntityRule(
entity: Entity,
rule: RuleFunction<T>,
): RemoteServerRule<T>? = getEntityRule(entity, rule.index)

/** Returns the given [ruleIndex] for [entity]. */
public fun <T : Any> getEntityRule(entity: Entity, ruleIndex: Int): RemoteServerRule<T>? =
public fun <T : Any> getEntityRule(
entity: Entity,
ruleIndex: Int,
): RemoteServerRule<T>? =
entities.computeIfAbsent(entity) { RuleHolder() }.let { holder ->
manager.entityRules.create(ruleIndex, holder)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,8 @@ import java.util.concurrent.ConcurrentHashMap
public open class NoxesiumManager(
public val plugin: Plugin,
public val logger: Logger,
) : NoxesiumServerManager<Player>, Listener {

) : NoxesiumServerManager<Player>,
Listener {
private val players = ConcurrentHashMap<UUID, Int>()
private val exact = ConcurrentHashMap<UUID, String>()
private val settings = ConcurrentHashMap<UUID, ClientSettings>()
Expand Down Expand Up @@ -64,12 +64,13 @@ public open class NoxesiumManager(
v2 = NoxesiumListenerV2(plugin, logger, this).register()

// Send server rule updates once a tick in a batch
task = Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, {
for ((player, profile) in profiles) {
if (!profile.needsUpdate) continue
updateServerRules(Bukkit.getPlayer(player) ?: continue, profile)
}
}, 1, 1)
task =
Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, {
for ((player, profile) in profiles) {
if (!profile.needsUpdate) continue
updateServerRules(Bukkit.getPlayer(player) ?: continue, profile)
}
}, 1, 1)

// Register a player when we receive the client information packet
NoxesiumPackets.SERVER_CLIENT_INFO.addListener(this) { packet, player ->
Expand Down Expand Up @@ -125,7 +126,10 @@ public open class NoxesiumManager(
/**
* Sends this packet to the given [player].
*/
public fun createPacket(player: Player, packet: NoxesiumPacket): ClientboundCustomPayloadPacket? {
public fun createPacket(
player: Player,
packet: NoxesiumPacket,
): ClientboundCustomPayloadPacket? {
val protocol = getProtocolVersion(player) ?: return null

// Use the newest protocol this client supports!
Expand All @@ -141,7 +145,10 @@ public open class NoxesiumManager(
/**
* Sends this packet to the given [player].
*/
public fun sendPacket(player: Player, packet: NoxesiumPacket) {
public fun sendPacket(
player: Player,
packet: NoxesiumPacket,
) {
// Use the newest protocol this client supports!
val nmsPacket = createPacket(player, packet) ?: return
val craftPlayer = player as CraftPlayer
Expand All @@ -153,7 +160,11 @@ public open class NoxesiumManager(
* the player back various packets related to the server information and default
* server rule values.
*/
internal fun registerPlayer(player: Player, protocolVersion: Int, version: String) {
internal fun registerPlayer(
player: Player,
protocolVersion: Int,
version: String,
) {
logger.info("${player.name} is running Noxesium $version ($protocolVersion)")
saveProtocol(player, version, protocolVersion)

Expand Down Expand Up @@ -182,7 +193,10 @@ public open class NoxesiumManager(
* Sends updated server rules to [player] based on all rules in [profile]
* that need to be updated.
*/
private fun updateServerRules(player: Player, profile: RuleHolder) {
private fun updateServerRules(
player: Player,
profile: RuleHolder,
) {
sendPacket(
player,
ClientboundChangeServerRulesPacket(
Expand All @@ -197,44 +211,50 @@ public open class NoxesiumManager(
}

/** Stores the protocol version for [player] as [version] with [protocolVersion]. */
internal fun saveProtocol(player: Player, version: String, protocolVersion: Int) {
internal fun saveProtocol(
player: Player,
version: String,
protocolVersion: Int,
) {
players[player.uniqueId] = protocolVersion
exact[player.uniqueId] = version
onPlayerVersionReceived(player, version, protocolVersion)
}

/** Stores client settings for [player] as [clientSettings]. */
internal fun saveSettings(player: Player, clientSettings: ClientSettings) {
internal fun saveSettings(
player: Player,
clientSettings: ClientSettings,
) {
settings[player.uniqueId] = clientSettings
onPlayerSettingsReceived(player, clientSettings)
}

/** Returns the given [rule] for [player]. */
public fun <T : Any> getServerRule(player: Player, rule: RuleFunction<T>): RemoteServerRule<T>? =
getServerRule(player, rule.index)

override fun <T : Any> getServerRule(player: Player, index: Int): RemoteServerRule<T>? =
public fun <T : Any> getServerRule(
player: Player,
rule: RuleFunction<T>,
): RemoteServerRule<T>? = getServerRule(player, rule.index)

override fun <T : Any> getServerRule(
player: Player,
index: Int,
): RemoteServerRule<T>? =
profiles.computeIfAbsent(player.uniqueId) { RuleHolder() }.let { holder ->
serverRules.create(index, holder, getProtocolVersion(player) ?: -1)
}

override fun getClientSettings(player: Player): ClientSettings? =
getClientSettings(player.uniqueId)
override fun getClientSettings(player: Player): ClientSettings? = getClientSettings(player.uniqueId)

override fun getClientSettings(playerId: UUID): ClientSettings? =
settings[playerId]
override fun getClientSettings(playerId: UUID): ClientSettings? = settings[playerId]

override fun getProtocolVersion(player: Player): Int? =
getProtocolVersion(player.uniqueId)
override fun getProtocolVersion(player: Player): Int? = getProtocolVersion(player.uniqueId)

override fun getExactVersion(player: Player): String? =
getExactVersion(player.uniqueId)
override fun getExactVersion(player: Player): String? = getExactVersion(player.uniqueId)

override fun getProtocolVersion(playerId: UUID): Int? =
players[playerId]
override fun getProtocolVersion(playerId: UUID): Int? = players[playerId]

override fun getExactVersion(playerId: UUID?): String? =
exact[playerId]
override fun getExactVersion(playerId: UUID?): String? = exact[playerId]

@EventHandler
public fun onPlayerQuit(e: PlayerQuitEvent) {
Expand All @@ -251,10 +271,17 @@ public open class NoxesiumManager(
}

/** Called when [player] informs the server they are on [protocolVersion]. */
protected open fun onPlayerVersionReceived(player: Player, version: String, protocolVersion: Int) {
protected open fun onPlayerVersionReceived(
player: Player,
version: String,
protocolVersion: Int,
) {
}

/** Called when [player] informs the server they are using [ClientSettings]. */
protected open fun onPlayerSettingsReceived(player: Player, clientSettings: ClientSettings) {
protected open fun onPlayerSettingsReceived(
player: Player,
clientSettings: ClientSettings,
) {
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ public data class RuleHolder(
/** All rules sent to this client. */
public val rules: MutableMap<Int, RemoteServerRule<*>> = ConcurrentHashMap(),
) : MutableMap<Int, RemoteServerRule<*>> by rules {

/** Whether this profile has pending updates. */
public val needsUpdate: Boolean
get() = rules.values.any { it.changePending }
Expand All @@ -30,26 +29,39 @@ public data class RuleContainer(
private val rules: MutableMap<Int, RuleFunction<*>> = ConcurrentHashMap(),
private val minimumProtocols: MutableMap<Int, Int> = ConcurrentHashMap(),
) {

/** All contents of this container. */
public val contents: Map<Int, RuleFunction<*>>
get() = rules

/** Returns whether rule [index] is available on [version]. */
public fun isAvailable(index: Int, version: Int): Boolean =
version >= (minimumProtocols[index] ?: throw IllegalArgumentException("Cannot find rule with index $index"))
public fun isAvailable(
index: Int,
version: Int,
): Boolean = version >= (minimumProtocols[index] ?: throw IllegalArgumentException("Cannot find rule with index $index"))

/** Registers a new rule with the given [index] and [ruleSupplier]. */
public fun register(index: Int, minimumProtocol: Int, ruleSupplier: RuleFunction<*>) {
public fun register(
index: Int,
minimumProtocol: Int,
ruleSupplier: RuleFunction<*>,
) {
require(!rules.containsKey(index)) { "Can't double register index $index" }
rules[index] = ruleSupplier
minimumProtocols[index] = minimumProtocol
}

/** Creates a new rule object, to be stored in the given map. */
public fun <T : Any> create(index: Int, storage: MutableMap<Int, RemoteServerRule<*>>, version: Int? = null): RemoteServerRule<T>? {
public fun <T : Any> create(
index: Int,
storage: MutableMap<Int, RemoteServerRule<*>>,
version: Int? = null,
): RemoteServerRule<T>? {
// Ensure that this player has the required protocol version, otherwise return `null`.
if (version != null && version < (minimumProtocols[index] ?: throw IllegalArgumentException("Cannot find rule with index $index"))) return null
if (version != null &&
version < (minimumProtocols[index] ?: throw IllegalArgumentException("Cannot find rule with index $index"))
) {
return null
}

return storage.computeIfAbsent(index) {
val function = rules[index] ?: throw IllegalArgumentException("Cannot find rule with index $index")
Expand Down
Loading

0 comments on commit 8c5c1f3

Please sign in to comment.