Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
8 changes: 5 additions & 3 deletions buildSrc/src/main/kotlin/core-convention.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,13 @@ import org.gradle.accessors.dm.LibrariesForLibs
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension

val libs = the<LibrariesForLibs>()
val javaVersion: String by project

plugins {
java
`java-library`
id("publish-convention")
id("java-toolchain-convention")

kotlin("jvm")
kotlin("plugin.serialization")
Expand Down Expand Up @@ -40,9 +42,6 @@ ksp {
}

extensions.configure<KotlinJvmProjectExtension> {
val javaVersion: String by project

jvmToolchain(javaVersion.toInt())
compilerOptions {
freeCompilerArgs = listOf("-Xjsr305=strict")
}
Expand Down Expand Up @@ -70,6 +69,9 @@ tasks {
shadowJar {
mergeServiceFiles()
duplicatesStrategy = DuplicatesStrategy.EXCLUDE

val relocationPrefix: String by project
relocate("net.kyori.adventure.nbt", "$relocationPrefix.kyori.nbt")
}

javadoc {
Expand Down
18 changes: 18 additions & 0 deletions buildSrc/src/main/kotlin/java-toolchain-convention.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import gradle.kotlin.dsl.accessors._bcd9a993373509de50154c5485fe667f.java

Copilot AI Feb 7, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The precompiled script plugin imports an internal generated accessor (gradle.kotlin.dsl.accessors._…​.java). This class name is Gradle-version-specific and can break the build when the accessor package changes; the plugin should not depend on it. Remove this import and rely on the normal java { ... } DSL after applying the java plugin.

Suggested change
import gradle.kotlin.dsl.accessors._bcd9a993373509de50154c5485fe667f.java

Copilot uses AI. Check for mistakes.
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension

val javaVersion: String by project

plugins {
java
}

extensions.findByType<KotlinJvmProjectExtension>()?.apply {
jvmToolchain(javaVersion.toInt())
}

java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(javaVersion))

Copilot AI Feb 7, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

JavaLanguageVersion.of(javaVersion) is passed a String, but Gradle’s toolchain API expects an integer language version. This will fail at script compilation time unless you convert to Int (or use JavaLanguageVersion.of(javaVersion.toInt())).

Suggested change
languageVersion.set(JavaLanguageVersion.of(javaVersion))
languageVersion.set(JavaLanguageVersion.of(javaVersion.toInt()))

Copilot uses AI. Check for mistakes.
}
}
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=1.21.11
group=dev.slne.surf
version=1.21.11-2.56.1
version=1.21.11-2.57.0
relocationPrefix=dev.slne.surf.surfapi.libs
snapshot=false
2 changes: 2 additions & 0 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ ktor = "3.4.0"
glm = "0.9.9.1-15"
ksp-version = "2.3.5"
reactor-netty = "1.3.2"
bytebuddy = "1.18.4"

# Plugin versions
maven-repo-auth = "3.0.4"
Expand Down Expand Up @@ -166,6 +167,7 @@ ktor-client-content-negotiation = { module = "io.ktor:ktor-client-content-negoti
ktor-serialization-kotlinx-json = { module = "io.ktor:ktor-serialization-kotlinx-json", version.ref = "ktor" }
reactor-netty-core = { module = "io.projectreactor.netty:reactor-netty-core", version.ref = "reactor-netty" }
reactor-netty-http = { module = "io.projectreactor.netty:reactor-netty-http", version.ref = "reactor-netty" }
bytebuddy = { module = "net.bytebuddy:byte-buddy", version.ref = "bytebuddy" }

# Plugin dependencies
kotlin-gradle-plugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlinVersion" }
Expand Down
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions-snapshots/gradle-9.4.0-20260128061951+0000-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.0-milestone-5-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
Expand Down
49 changes: 49 additions & 0 deletions surf-api-bukkit/surf-api-bukkit-api/api/surf-api-bukkit-api.api
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,23 @@ public final class dev/slne/surf/surfapi/bukkit/api/collections/LazyIntList {
public final fun set (II)V
}

public final class dev/slne/surf/surfapi/bukkit/api/command/args/AdventureCompoundBinaryTagArgument : dev/jorel/commandapi/arguments/SafeOverrideableArgument {
public fun <init> (Ljava/lang/String;)V
public fun getArgumentType ()Ldev/jorel/commandapi/arguments/CommandAPIArgumentType;
public fun getPrimitiveType ()Ljava/lang/Class;
public synthetic fun parseArgument (Lcom/mojang/brigadier/context/CommandContext;Ljava/lang/String;Ldev/jorel/commandapi/executors/CommandArguments;)Ljava/lang/Object;
public fun parseArgument (Lcom/mojang/brigadier/context/CommandContext;Ljava/lang/String;Ldev/jorel/commandapi/executors/CommandArguments;)Lnet/kyori/adventure/nbt/CompoundBinaryTag;
}

public final class dev/slne/surf/surfapi/bukkit/api/command/args/AdventureCompoundBinaryTagArgumentKt {
public static final fun adventureCompoundBinaryTagArgument (Ldev/jorel/commandapi/CommandAPICommand;Ljava/lang/String;ZLkotlin/jvm/functions/Function1;)Ldev/jorel/commandapi/CommandAPICommand;
public static final fun adventureCompoundBinaryTagArgument (Ldev/jorel/commandapi/CommandTree;Ljava/lang/String;ZLkotlin/jvm/functions/Function1;)Ldev/jorel/commandapi/CommandTree;
public static final fun adventureCompoundBinaryTagArgument (Ldev/jorel/commandapi/arguments/Argument;Ljava/lang/String;ZLkotlin/jvm/functions/Function1;)Ldev/jorel/commandapi/arguments/Argument;
public static synthetic fun adventureCompoundBinaryTagArgument$default (Ldev/jorel/commandapi/CommandAPICommand;Ljava/lang/String;ZLkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ldev/jorel/commandapi/CommandAPICommand;
public static synthetic fun adventureCompoundBinaryTagArgument$default (Ldev/jorel/commandapi/CommandTree;Ljava/lang/String;ZLkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ldev/jorel/commandapi/CommandTree;
public static synthetic fun adventureCompoundBinaryTagArgument$default (Ldev/jorel/commandapi/arguments/Argument;Ljava/lang/String;ZLkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ldev/jorel/commandapi/arguments/Argument;
}

public class dev/slne/surf/surfapi/bukkit/api/command/args/MiniMessageArgument : dev/jorel/commandapi/arguments/CustomArgument {
public fun <init> (Ljava/lang/String;)V
}
Expand Down Expand Up @@ -770,6 +787,22 @@ public final class dev/slne/surf/surfapi/bukkit/api/nms/SurfBukkitNmsBridgeKt {
public static final fun getNmsBridge ()Ldev/slne/surf/surfapi/bukkit/api/nms/SurfBukkitNmsBridge;
}

public abstract interface class dev/slne/surf/surfapi/bukkit/api/nms/bridges/SurfBukkitNmsCommandArgumentTypesBridge {
public static final field Companion Ldev/slne/surf/surfapi/bukkit/api/nms/bridges/SurfBukkitNmsCommandArgumentTypesBridge$Companion;
public abstract fun compoundTag ()Lcom/mojang/brigadier/arguments/ArgumentType;
public abstract fun getCompoundTag (Lcom/mojang/brigadier/context/CommandContext;Ljava/lang/String;)Lnet/kyori/adventure/nbt/CompoundBinaryTag;
}

public final class dev/slne/surf/surfapi/bukkit/api/nms/bridges/SurfBukkitNmsCommandArgumentTypesBridge$Companion : dev/slne/surf/surfapi/bukkit/api/nms/bridges/SurfBukkitNmsCommandArgumentTypesBridge {
public fun compoundTag ()Lcom/mojang/brigadier/arguments/ArgumentType;
public fun getCompoundTag (Lcom/mojang/brigadier/context/CommandContext;Ljava/lang/String;)Lnet/kyori/adventure/nbt/CompoundBinaryTag;
public final fun getInstance ()Ldev/slne/surf/surfapi/bukkit/api/nms/bridges/SurfBukkitNmsCommandArgumentTypesBridge;
}

public final class dev/slne/surf/surfapi/bukkit/api/nms/bridges/SurfBukkitNmsCommandArgumentTypesBridgeKt {
public static final fun getCommandArgumentTypes ()Ldev/slne/surf/surfapi/bukkit/api/nms/bridges/SurfBukkitNmsCommandArgumentTypesBridge;
}

public abstract interface class dev/slne/surf/surfapi/bukkit/api/nms/bridges/SurfBukkitNmsCommonBridge {
public static final field Companion Ldev/slne/surf/surfapi/bukkit/api/nms/bridges/SurfBukkitNmsCommonBridge$Companion;
public abstract fun addCompostable (Lorg/bukkit/Material;F)V
Expand Down Expand Up @@ -801,6 +834,20 @@ public final class dev/slne/surf/surfapi/bukkit/api/nms/bridges/SurfBukkitNmsCom
public static final fun getNmsCommonBridge ()Ldev/slne/surf/surfapi/bukkit/api/nms/bridges/SurfBukkitNmsCommonBridge;
}

public abstract interface class dev/slne/surf/surfapi/bukkit/api/nms/bridges/SurfBukkitNmsEntityBridge {
public static final field Companion Ldev/slne/surf/surfapi/bukkit/api/nms/bridges/SurfBukkitNmsEntityBridge$Companion;
public abstract fun createEntityByNbt (Lorg/bukkit/World;Lorg/bukkit/entity/EntityType;Lio/papermc/paper/math/FinePosition;Lnet/kyori/adventure/nbt/CompoundBinaryTag;)V
}

public final class dev/slne/surf/surfapi/bukkit/api/nms/bridges/SurfBukkitNmsEntityBridge$Companion : dev/slne/surf/surfapi/bukkit/api/nms/bridges/SurfBukkitNmsEntityBridge {
public fun createEntityByNbt (Lorg/bukkit/World;Lorg/bukkit/entity/EntityType;Lio/papermc/paper/math/FinePosition;Lnet/kyori/adventure/nbt/CompoundBinaryTag;)V
public final fun getInstance ()Ldev/slne/surf/surfapi/bukkit/api/nms/bridges/SurfBukkitNmsEntityBridge;
}

public final class dev/slne/surf/surfapi/bukkit/api/nms/bridges/SurfBukkitNmsEntityBridgeKt {
public static final fun getEntityBridge ()Ldev/slne/surf/surfapi/bukkit/api/nms/bridges/SurfBukkitNmsEntityBridge;
}

public abstract interface class dev/slne/surf/surfapi/bukkit/api/nms/bridges/SurfBukkitNmsGlowingBridge {
public static final field Companion Ldev/slne/surf/surfapi/bukkit/api/nms/bridges/SurfBukkitNmsGlowingBridge$Companion;
public abstract fun getCurrentFlags (Lorg/bukkit/entity/Entity;)B
Expand Down Expand Up @@ -1490,7 +1537,9 @@ public final class dev/slne/surf/surfapi/bukkit/api/util/UtilBukkit {
public static final fun getCallingPlugin (I)Lorg/bukkit/plugin/java/JavaPlugin;
public static synthetic fun getCallingPlugin$default (IILjava/lang/Object;)Lorg/bukkit/plugin/java/JavaPlugin;
public static final fun getChunkKey (Lorg/bukkit/Location;)J
public static final fun getChunkX (Lio/papermc/paper/math/Position;)I
public static final fun getChunkX (Lorg/bukkit/Location;)I
public static final fun getChunkZ (Lio/papermc/paper/math/Position;)I
public static final fun getChunkZ (Lorg/bukkit/Location;)I
public static final fun getHighestBlockYAtBlockCoordinates (Lorg/bukkit/ChunkSnapshot;II)I
public static final fun getXFromChunkKey (J)I
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package dev.slne.surf.surfapi.bukkit.api.command.args

import com.mojang.brigadier.context.CommandContext
import dev.jorel.commandapi.CommandAPICommand
import dev.jorel.commandapi.CommandTree
import dev.jorel.commandapi.arguments.Argument
import dev.jorel.commandapi.arguments.CommandAPIArgumentType
import dev.jorel.commandapi.arguments.SafeOverrideableArgument
import dev.jorel.commandapi.executors.CommandArguments
import dev.slne.surf.surfapi.bukkit.api.nms.NmsUseWithCaution
import dev.slne.surf.surfapi.bukkit.api.nms.bridges.commandArgumentTypes
import net.kyori.adventure.nbt.CompoundBinaryTag
import net.kyori.adventure.nbt.TagStringIO

@OptIn(NmsUseWithCaution::class)
class AdventureCompoundBinaryTagArgument(nodeName: String) :
SafeOverrideableArgument<CompoundBinaryTag, CompoundBinaryTag>(
nodeName, commandArgumentTypes.compoundTag(), { TagStringIO.tagStringIO().asString(it) }
) {
override fun getPrimitiveType(): Class<CompoundBinaryTag> {
return CompoundBinaryTag::class.java
}

override fun getArgumentType(): CommandAPIArgumentType {
return CommandAPIArgumentType.NBT_COMPOUND
}

override fun <Source> parseArgument(
ctx: CommandContext<Source>,
key: String,
previousArgs: CommandArguments
): CompoundBinaryTag {
return commandArgumentTypes.getCompoundTag(ctx, key)
}
}

inline fun CommandTree.adventureCompoundBinaryTagArgument(
nodeName: String,
optional: Boolean = false,
block: Argument<*>.() -> Unit = {}
): CommandTree = then(AdventureCompoundBinaryTagArgument(nodeName).setOptional(optional).apply(block))

inline fun Argument<*>.adventureCompoundBinaryTagArgument(
nodeName: String,
optional: Boolean = false,
block: Argument<*>.() -> Unit = {}
): Argument<*> = then(AdventureCompoundBinaryTagArgument(nodeName).setOptional(optional).apply(block))


inline fun CommandAPICommand.adventureCompoundBinaryTagArgument(
nodeName: String,
optional: Boolean = false,
block: Argument<*>.() -> Unit = {}
): CommandAPICommand = withArguments(AdventureCompoundBinaryTagArgument(nodeName).setOptional(optional).apply(block))
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package dev.slne.surf.surfapi.bukkit.api.nms.bridges

import com.mojang.brigadier.arguments.ArgumentType
import com.mojang.brigadier.context.CommandContext
import dev.slne.surf.surfapi.bukkit.api.nms.NmsUseWithCaution
import dev.slne.surf.surfapi.core.api.util.requiredService
import net.kyori.adventure.nbt.CompoundBinaryTag

@NmsUseWithCaution
interface SurfBukkitNmsCommandArgumentTypesBridge {

fun compoundTag(): ArgumentType<*>
fun getCompoundTag(ctx: CommandContext<*>, key: String): CompoundBinaryTag

companion object : SurfBukkitNmsCommandArgumentTypesBridge by commandArgumentTypes {
val instance = commandArgumentTypes
}
}

@NmsUseWithCaution
val commandArgumentTypes = requiredService<SurfBukkitNmsCommandArgumentTypesBridge>()
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package dev.slne.surf.surfapi.bukkit.api.nms.bridges

import dev.jorel.commandapi.exceptions.WrapperCommandSyntaxException
import dev.slne.surf.surfapi.bukkit.api.nms.NmsUseWithCaution
import dev.slne.surf.surfapi.core.api.util.requiredService
import io.papermc.paper.math.FinePosition
import net.kyori.adventure.nbt.CompoundBinaryTag
import org.bukkit.World
import org.bukkit.entity.EntityType

@NmsUseWithCaution
interface SurfBukkitNmsEntityBridge {

@Throws(WrapperCommandSyntaxException::class)
fun createEntityByNbt(world: World, type: EntityType, pos: FinePosition, tag: CompoundBinaryTag)

companion object : SurfBukkitNmsEntityBridge by entityBridge {
val instance = entityBridge
}
}

@NmsUseWithCaution
val entityBridge = requiredService<SurfBukkitNmsEntityBridge>()
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import dev.slne.surf.surfapi.core.api.util.getCallerClass
import dev.slne.surf.surfapi.core.api.util.mutableLong2ObjectMapOf
import dev.slne.surf.surfapi.core.api.util.mutableObjectListOf
import io.papermc.paper.math.BlockPosition
import io.papermc.paper.math.Position
import it.unimi.dsi.fastutil.objects.ObjectList
import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll
Expand Down Expand Up @@ -115,6 +116,16 @@ infix fun Location.distanceSqt(other: Location): Double = distanceSquared(other)
*/
val Location.chunkX get() = blockX shr 4

/**
* Gets the chunk X coordinate of this position.
*/
val Position.chunkX get() = blockX() shr 4

/**
* Gets the chunk Z coordinate of this position.
*/
val Position.chunkZ get() = blockZ() shr 4

/**
* Gets the chunk Z coordinate of this location.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ tasks {
minecraftVersion(findProperty("mcVersion") as String)

downloadPlugins {
// hangar("CommandAPI", libs.versions.commandapi.get()) TODO: update to 1.21.11 when released
hangar("CommandAPI", libs.versions.commandapi.get())
modrinth("packetevents", libs.versions.packetevents.plugin.get() + "+spigot")
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,7 @@
package dev.slne.surf.surfapi.bukkit.test.command;

import dev.jorel.commandapi.CommandAPICommand;
import dev.slne.surf.surfapi.bukkit.test.command.subcommands.CommandExceptionTest;
import dev.slne.surf.surfapi.bukkit.test.command.subcommands.GlowingTest;
import dev.slne.surf.surfapi.bukkit.test.command.subcommands.InventoryTest;
import dev.slne.surf.surfapi.bukkit.test.command.subcommands.MaxStacksizeTest;
import dev.slne.surf.surfapi.bukkit.test.command.subcommands.PacketEntityTest;
import dev.slne.surf.surfapi.bukkit.test.command.subcommands.PacketLoreTest;
import dev.slne.surf.surfapi.bukkit.test.command.subcommands.PaginationTest;
import dev.slne.surf.surfapi.bukkit.test.command.subcommands.PrefixConfigTest;
import dev.slne.surf.surfapi.bukkit.test.command.subcommands.ReflectionTest;
import dev.slne.surf.surfapi.bukkit.test.command.subcommands.ScoreboardTest;
import dev.slne.surf.surfapi.bukkit.test.command.subcommands.SmoothTimeSkip;
import dev.slne.surf.surfapi.bukkit.test.command.subcommands.SuspendCommandExecutionTest;
import dev.slne.surf.surfapi.bukkit.test.command.subcommands.ToastTest;
import dev.slne.surf.surfapi.bukkit.test.command.subcommands.VisualizerTest;
import dev.slne.surf.surfapi.bukkit.test.command.subcommands.*;
import dev.slne.surf.surfapi.bukkit.test.command.subcommands.gui.InventoryFrameworkTest;

public class SurfApiTestCommand extends CommandAPICommand {
Expand All @@ -38,8 +25,9 @@ public SurfApiTestCommand() {
new GlowingTest("glowing"),
new PaginationTest("pagination"),
new InventoryTest("inventory"),
new ToastTest(("toast")),
new SuspendCommandExecutionTest("suspendCommandExecution")
new ToastTest("toast"),
new SuspendCommandExecutionTest("suspendCommandExecution"),
new SummonCommandTest("summoncommand")
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package dev.slne.surf.surfapi.bukkit.test.command.subcommands

import dev.jorel.commandapi.CommandAPICommand
import dev.jorel.commandapi.kotlindsl.entityTypeArgument
import dev.jorel.commandapi.kotlindsl.getValue
import dev.jorel.commandapi.kotlindsl.playerExecutor
import dev.slne.surf.surfapi.bukkit.api.command.args.adventureCompoundBinaryTagArgument
import dev.slne.surf.surfapi.bukkit.api.nms.bridges.entityBridge
import net.kyori.adventure.nbt.CompoundBinaryTag
import org.bukkit.entity.EntityType

class SummonCommandTest(name: String) : CommandAPICommand(name) {
init {
entityTypeArgument("type")
adventureCompoundBinaryTagArgument("nbt")

playerExecutor { sender, args ->
val type: EntityType by args
val nbt: CompoundBinaryTag by args

entityBridge.createEntityByNbt(sender.world, type, sender.location, nbt)

Copilot AI Feb 7, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This command passes sender.location (a Bukkit Location) into createEntityByNbt, which expects a FinePosition. This won’t compile (and would be an unsafe cast at runtime). Convert the location to a FinePosition (or change the bridge API to accept Location/Position).

Suggested change
entityBridge.createEntityByNbt(sender.world, type, sender.location, nbt)
entityBridge.createEntityByNbt(sender.world, type, sender.location.toFinePosition(), nbt)

Copilot uses AI. Check for mistakes.
}
}
}
1 change: 0 additions & 1 deletion surf-api-bukkit/surf-api-bukkit-server/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,6 @@ tasks {
shadowJar {
val relocationPrefix: String by project
relocate("me.devnatan.inventoryframework", "$relocationPrefix.devnatan.inventoryframework")
relocate("net.kyori.adventure.nbt", "$relocationPrefix.kyori.nbt")
}
}

Expand Down
Loading
Loading