Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
2ab007b
feat: add toast support with builder and API methods
TheBjoRedCraft Oct 18, 2025
59d51ee
fix: update version to 1.21.10-2.40.2
TheBjoRedCraft Oct 18, 2025
06bc92c
feat: integrate buildText method for toast message customization
TheBjoRedCraft Oct 18, 2025
913c24f
feat: refactor toast API to use core package and enhance send functio…
TheBjoRedCraft Oct 19, 2025
dc863b0
feat: update toast API to use Bukkit and Velocity builders for enhanc…
TheBjoRedCraft Oct 19, 2025
ba61c7f
feat: enhance toast sending functionality by integrating surfCoreApi …
TheBjoRedCraft Oct 19, 2025
effcbe3
feat: refactor toast implementation to streamline packet creation and…
TheBjoRedCraft Oct 19, 2025
a2f3c48
feat: enhance ToastTest with multi-line support for improved message …
TheBjoRedCraft Oct 19, 2025
755c7f6
feat: undo deletetion of inventory test class
TheBjoRedCraft Oct 19, 2025
36132d9
feat: remove unused buildText function in Toast implementation for cl…
TheBjoRedCraft Oct 19, 2025
2bf12e8
feat: add missing getSize method to CustomBlockData
TheBjoRedCraft Oct 19, 2025
a62fa38
Update gradle.properties
TheBjoRedCraft Oct 19, 2025
84a7f67
feat: downgrade version from 1.5.4 to 1.5.3 in build configuration
TheBjoRedCraft Oct 19, 2025
41abdb7
Merge remote-tracking branch 'origin/feat/150-add-toast-support' into…
TheBjoRedCraft Oct 19, 2025
10c8223
feat: replace ToastBukkitBuilder with ToastBuilder for consistency ac…
TheBjoRedCraft Oct 19, 2025
ea56856
feat: update toast creation to use ToastBuilder for consistency
TheBjoRedCraft Oct 19, 2025
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=21
mcVersion=1.21.10
group=dev.slne.surf
version=1.21.10-2.40.1
version=1.21.10-2.41.0
relocationPrefix=dev.slne.surf.surfapi.libs
snapshot=false
64 changes: 64 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 @@ -1267,9 +1267,12 @@ public final class dev/jorel/commandapi/kotlindsl/ExecutorDSLKt {
public abstract interface class dev/slne/surf/surfapi/bukkit/api/SurfBukkitApi : dev/slne/surf/surfapi/core/api/SurfCoreApi {
public static final field Companion Ldev/slne/surf/surfapi/bukkit/api/SurfBukkitApi$Companion;
public abstract fun createScoreboard (Lnet/kyori/adventure/text/Component;)Ldev/slne/surf/surfapi/bukkit/api/scoreboard/SurfScoreboardBuilder;
public abstract fun createToast (Lkotlin/jvm/functions/Function1;)Ldev/slne/surf/surfapi/core/api/toast/Toast;
public abstract fun createToast (Lorg/bukkit/Material;Lnet/kyori/adventure/text/Component;Ldev/slne/surf/surfapi/core/api/toast/ToastStyle;)Ldev/slne/surf/surfapi/core/api/toast/Toast;
public static fun getInstance ()Ldev/slne/surf/surfapi/bukkit/api/SurfBukkitApi;
public abstract fun scoreboardLibrary ()Lnet/megavex/scoreboardlibrary/api/ScoreboardLibrary;
public fun sendPlayerToServer (Lorg/bukkit/entity/Player;Ljava/lang/String;)V
public abstract fun sendToast (Lorg/bukkit/entity/Player;Ldev/slne/surf/surfapi/core/api/toast/Toast;)V
public abstract fun skipTimeSmoothly (JJLkotlin/coroutines/Continuation;)Ljava/lang/Object;
public abstract fun skipTimeSmoothly (JLkotlin/coroutines/Continuation;)Ljava/lang/Object;
public abstract fun skipTimeSmoothly (Ldev/slne/surf/surfapi/bukkit/api/time/SkipOperations$SkipOperation;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
Expand Down Expand Up @@ -2334,6 +2337,26 @@ public abstract interface class dev/slne/surf/surfapi/bukkit/api/nms/listener/pa
public abstract fun getPacketClass ()Ljava/lang/Class;
}

public abstract interface class dev/slne/surf/surfapi/bukkit/api/nms/listener/packets/clientbound/CommandSuggestionsResponsePacket : dev/slne/surf/surfapi/bukkit/api/nms/listener/packets/clientbound/NmsClientboundPacket {
public abstract fun getId ()I
public abstract fun getLength ()I
public abstract fun getMatches ()Ljava/util/List;
public abstract fun getStart ()I
}

public final class dev/slne/surf/surfapi/bukkit/api/nms/listener/packets/clientbound/CommandSuggestionsResponsePacket$Match {
public fun <init> (Ljava/lang/String;Ljava/util/Optional;)V
public final fun component1 ()Ljava/lang/String;
public final fun component2 ()Ljava/util/Optional;
public final fun copy (Ljava/lang/String;Ljava/util/Optional;)Ldev/slne/surf/surfapi/bukkit/api/nms/listener/packets/clientbound/CommandSuggestionsResponsePacket$Match;
public static synthetic fun copy$default (Ldev/slne/surf/surfapi/bukkit/api/nms/listener/packets/clientbound/CommandSuggestionsResponsePacket$Match;Ljava/lang/String;Ljava/util/Optional;ILjava/lang/Object;)Ldev/slne/surf/surfapi/bukkit/api/nms/listener/packets/clientbound/CommandSuggestionsResponsePacket$Match;
public fun equals (Ljava/lang/Object;)Z
public final fun getText ()Ljava/lang/String;
public final fun getTooltip ()Ljava/util/Optional;
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
}

public abstract interface class dev/slne/surf/surfapi/bukkit/api/nms/listener/packets/clientbound/DisconnectPacket : dev/slne/surf/surfapi/bukkit/api/nms/listener/packets/clientbound/NmsClientboundPacket {
public abstract fun getReason ()Lnet/kyori/adventure/text/Component;
}
Expand Down Expand Up @@ -2532,6 +2555,18 @@ public final class dev/slne/surf/surfapi/bukkit/api/time/TimeSkipResult : java/l
public static fun values ()[Ldev/slne/surf/surfapi/bukkit/api/time/TimeSkipResult;
}

public final class dev/slne/surf/surfapi/bukkit/api/toast/ToastBukkitBuilder {
public fun <init> ()V
public final fun build ()Ldev/slne/surf/surfapi/core/api/toast/Toast;
public final fun icon (Lorg/bukkit/Material;)V
public final fun style (Ldev/slne/surf/surfapi/core/api/toast/ToastStyle;)V
public final fun text (Lkotlin/jvm/functions/Function1;)V
}

public final class dev/slne/surf/surfapi/bukkit/api/toast/ToastBukkitDslKt {
public static final fun toast (Lkotlin/jvm/functions/Function1;)Ldev/slne/surf/surfapi/core/api/toast/Toast;
}

public final class dev/slne/surf/surfapi/bukkit/api/util/UtilBukkit {
public static final fun computeHighestYBlock (Ljava/util/Collection;Lorg/bukkit/World;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public static final fun dispatcher (Lorg/bukkit/Location;Lcom/github/shynixn/mccoroutine/folia/SuspendingPlugin;)Lkotlin/coroutines/CoroutineContext;
Expand All @@ -2556,6 +2591,9 @@ public final class dev/slne/surf/surfapi/bukkit/api/util/UtilBukkit {
public static final fun isChunkVisible (Lorg/bukkit/entity/Player;Lorg/bukkit/Location;)Z
public static final fun isChunkVisible (Lorg/bukkit/entity/Player;Lorg/bukkit/World;II)Z
public static final fun key (Ljava/lang/String;)Lorg/bukkit/NamespacedKey;
public static final fun send (Ldev/slne/surf/surfapi/core/api/toast/Toast;Lorg/bukkit/entity/Player;)V
public static final fun sendToast (Lorg/bukkit/entity/Player;Ldev/slne/surf/surfapi/core/api/toast/Toast;)V
public static final fun sendToast (Lorg/bukkit/entity/Player;Lkotlin/jvm/functions/Function1;)V
public static final fun toOfflinePlayers (Ljava/lang/Iterable;)Ljava/util/List;
public static final fun toOfflinePlayers (Lkotlin/sequences/Sequence;)Lkotlin/sequences/Sequence;
public static final fun toPlayers (Ljava/lang/Iterable;)Ljava/util/List;
Expand Down Expand Up @@ -9629,6 +9667,32 @@ public final class dev/slne/surf/surfapi/core/api/service/UUIDSerializer : kotli
public fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/util/UUID;)V
}

public abstract interface class dev/slne/surf/surfapi/core/api/toast/Toast {
public abstract fun getIcon ()Lcom/github/retrooper/packetevents/protocol/item/type/ItemType;
public abstract fun getStyle ()Ldev/slne/surf/surfapi/core/api/toast/ToastStyle;
public abstract fun getText ()Lnet/kyori/adventure/text/Component;
public abstract fun send (Ljava/util/UUID;)V
}

public abstract interface class dev/slne/surf/surfapi/core/api/toast/ToastService {
public static final field Companion Ldev/slne/surf/surfapi/core/api/toast/ToastService$Companion;
public abstract fun createToast (Lcom/github/retrooper/packetevents/protocol/item/type/ItemType;Lnet/kyori/adventure/text/Component;Ldev/slne/surf/surfapi/core/api/toast/ToastStyle;)Ldev/slne/surf/surfapi/core/api/toast/Toast;
public abstract fun sendToast (Ljava/util/UUID;Ldev/slne/surf/surfapi/core/api/toast/Toast;)V
}

public final class dev/slne/surf/surfapi/core/api/toast/ToastService$Companion {
public final fun getINSTANCE ()Ldev/slne/surf/surfapi/core/api/toast/ToastService;
}

public final class dev/slne/surf/surfapi/core/api/toast/ToastStyle : java/lang/Enum {
public static final field CHALLENGE Ldev/slne/surf/surfapi/core/api/toast/ToastStyle;
public static final field GOAL Ldev/slne/surf/surfapi/core/api/toast/ToastStyle;
public static final field TASK Ldev/slne/surf/surfapi/core/api/toast/ToastStyle;
public static fun getEntries ()Lkotlin/enums/EnumEntries;
public static fun valueOf (Ljava/lang/String;)Ldev/slne/surf/surfapi/core/api/toast/ToastStyle;
public static fun values ()[Ldev/slne/surf/surfapi/core/api/toast/ToastStyle;
}

public abstract interface class dev/slne/surf/surfapi/core/api/util/ByEnum {
public abstract fun value ()Ljava/lang/Object;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,12 @@ import dev.slne.surf.surfapi.bukkit.api.scoreboard.SurfScoreboardBuilder
import dev.slne.surf.surfapi.bukkit.api.time.SkipOperations.SkipOperation
import dev.slne.surf.surfapi.bukkit.api.time.TimeSkipResult
import dev.slne.surf.surfapi.core.api.SurfCoreApi
import dev.slne.surf.surfapi.core.api.toast.Toast
import dev.slne.surf.surfapi.core.api.toast.ToastBuilder
import dev.slne.surf.surfapi.core.api.toast.ToastStyle
import net.kyori.adventure.text.Component
import net.megavex.scoreboardlibrary.api.ScoreboardLibrary
import org.bukkit.Material
import org.bukkit.World
import org.bukkit.entity.Player
import org.jetbrains.annotations.ApiStatus
Expand Down Expand Up @@ -104,6 +108,42 @@ interface SurfBukkitApi : SurfCoreApi {
*/
suspend fun skipTimeSmoothly(skipOperation: SkipOperation): Map<World, TimeSkipResult>

/**
* Creates a Toast using the provided builder function.
*
* @param builder A lambda function that configures the ToastBuilder.
* @return The created Toast instance.
*
* @see ToastBuilder
*/
fun createToast(builder: ToastBuilder.() -> Unit): Toast

/**
* Creates a Toast with the specified icon, display text, and style.
*
* @param icon The icon material for the toast.
* @param text The display text of the toast.
* @param style The style of the toast.
*
* @return The created Toast instance.
* @see Toast
*/
fun createToast(
icon: Material,
text: Component,
style: ToastStyle
): Toast

/**
* Sends a toast to the specified player.
*
* @param player The player to whom the toast will be sent.
* @param toast The toast to be sent.
*
* @see Toast
*/
fun sendToast(player: Player, toast: Toast)

companion object {
@JvmStatic
val instance get() = SurfCoreApi.instance as SurfBukkitApi
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ import com.github.shynixn.mccoroutine.folia.SuspendingPlugin
import com.github.shynixn.mccoroutine.folia.entityDispatcher
import com.github.shynixn.mccoroutine.folia.regionDispatcher
import dev.slne.surf.surfapi.bukkit.api.SurfBukkitApi
import dev.slne.surf.surfapi.bukkit.api.surfBukkitApi
import dev.slne.surf.surfapi.core.api.toast.Toast
import dev.slne.surf.surfapi.core.api.toast.ToastBuilder
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
Expand Down Expand Up @@ -270,3 +273,9 @@ suspend fun World.getBlockAtAsync(pos: BlockPosition): Block {
)
}
}

fun Player.sendToast(toast: Toast) = toast.send(this.uniqueId)
fun Player.sendToast(block: ToastBuilder.() -> Unit) =
surfBukkitApi.createToast(block).send(this.uniqueId)

fun Toast.send(player: Player) = send(player.uniqueId)
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
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.ToastTest;
import dev.slne.surf.surfapi.bukkit.test.command.subcommands.VisualizerTest;
import dev.slne.surf.surfapi.bukkit.test.command.subcommands.gui.InventoryFrameworkTest;

Expand All @@ -35,7 +36,8 @@ public SurfApiTestCommand() {
new VisualizerTest("visualizer"),
new GlowingTest("glowing"),
new PaginationTest("pagination"),
new InventoryTest("inventory")
new InventoryTest("inventory"),
new ToastTest(("toast"))
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package dev.slne.surf.surfapi.bukkit.test.command.subcommands

import com.github.retrooper.packetevents.protocol.item.type.ItemTypes
import dev.jorel.commandapi.CommandAPICommand
import dev.jorel.commandapi.kotlindsl.playerExecutor
import dev.slne.surf.surfapi.bukkit.api.surfBukkitApi
import dev.slne.surf.surfapi.bukkit.api.util.send
import dev.slne.surf.surfapi.bukkit.api.util.sendToast
import dev.slne.surf.surfapi.core.api.messages.adventure.buildText
import dev.slne.surf.surfapi.core.api.toast.ToastStyle
import dev.slne.surf.surfapi.core.api.toast.toast
import org.bukkit.Material

class ToastTest(name: String) : CommandAPICommand(name) {
init {
playerExecutor { player, _ ->
player.sendToast {
icon(ItemTypes.DIAMOND)

text {
info("Dsl-Extension Test")
}

style(ToastStyle.TASK)
}

player.sendToast(toast {
icon(ItemTypes.GOLD_INGOT)

text {
info("Toast-Builder-Dsl Test")
appendNewline()
info("With multiple lines!")
}

style(ToastStyle.CHALLENGE)
})

surfBukkitApi.createToast(Material.NETHERITE_AXE, buildText {
info("Direct API Call Test")
}, ToastStyle.GOAL).send(player)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,21 @@ import dev.slne.surf.surfapi.bukkit.server.impl.scoreboard.SurfScoreboardBuilder
import dev.slne.surf.surfapi.bukkit.server.plugin
import dev.slne.surf.surfapi.bukkit.server.time.TimeHandler
import dev.slne.surf.surfapi.core.api.SurfCoreApi
import dev.slne.surf.surfapi.core.api.toast.Toast
import dev.slne.surf.surfapi.core.api.toast.ToastBuilder
import dev.slne.surf.surfapi.core.api.toast.ToastStyle
import dev.slne.surf.surfapi.core.api.util.checkInstantiationByServiceLoader
import dev.slne.surf.surfapi.core.api.util.mutableObject2ObjectMapOf
import dev.slne.surf.surfapi.core.server.impl.SurfCoreApiImpl
import dev.slne.surf.surfapi.core.server.impl.toast.ToastImpl
import io.github.retrooper.packetevents.util.SpigotConversionUtil
import kotlinx.coroutines.async
import kotlinx.coroutines.coroutineScope
import net.kyori.adventure.text.Component
import org.bukkit.Bukkit
import org.bukkit.Material
import org.bukkit.World
import org.bukkit.entity.Player
import java.util.*

@AutoService(SurfCoreApi::class)
Expand Down Expand Up @@ -103,4 +110,18 @@ class SurfBukkitApiImpl : SurfCoreApiImpl(), SurfBukkitApi {
}
}.mapValuesTo(mutableObject2ObjectMapOf(worlds.size)) { (_, def) -> def.await() }
}

override fun createToast(builder: ToastBuilder.() -> Unit): Toast =
ToastBuilder().apply(builder).build()

override fun createToast(icon: Material, text: Component, style: ToastStyle): Toast = ToastImpl(
SpigotConversionUtil.fromBukkitItemMaterial(icon),
text,
style
)

override fun sendToast(
player: Player,
toast: Toast
) = toast.send(player.uniqueId)
}
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,10 @@ class CustomBlockData(val block: Block) : CustomBlockPersistentDataContainer {
return pdc.serializeToBytes()
}

override fun getSize(): Int {
return pdc.size
}

companion object {
fun getKey(block: Block): NamespacedKey {
return key("x${block.x and 15}y${block.y}z${block.z and 15}")
Expand Down
26 changes: 26 additions & 0 deletions surf-api-core/surf-api-core-api/api/surf-api-core-api.api
Original file line number Diff line number Diff line change
Expand Up @@ -7495,6 +7495,32 @@ public final class dev/slne/surf/surfapi/core/api/service/UUIDSerializer : kotli
public fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/util/UUID;)V
}

public abstract interface class dev/slne/surf/surfapi/core/api/toast/Toast {
public abstract fun getIcon ()Lcom/github/retrooper/packetevents/protocol/item/type/ItemType;
public abstract fun getStyle ()Ldev/slne/surf/surfapi/core/api/toast/ToastStyle;
public abstract fun getText ()Lnet/kyori/adventure/text/Component;
public abstract fun send (Ljava/util/UUID;)V
}

public abstract interface class dev/slne/surf/surfapi/core/api/toast/ToastService {
public static final field Companion Ldev/slne/surf/surfapi/core/api/toast/ToastService$Companion;
public abstract fun createToast (Lcom/github/retrooper/packetevents/protocol/item/type/ItemType;Lnet/kyori/adventure/text/Component;Ldev/slne/surf/surfapi/core/api/toast/ToastStyle;)Ldev/slne/surf/surfapi/core/api/toast/Toast;
public abstract fun sendToast (Ljava/util/UUID;Ldev/slne/surf/surfapi/core/api/toast/Toast;)V
}

public final class dev/slne/surf/surfapi/core/api/toast/ToastService$Companion {
public final fun getINSTANCE ()Ldev/slne/surf/surfapi/core/api/toast/ToastService;
}

public final class dev/slne/surf/surfapi/core/api/toast/ToastStyle : java/lang/Enum {
public static final field CHALLENGE Ldev/slne/surf/surfapi/core/api/toast/ToastStyle;
public static final field GOAL Ldev/slne/surf/surfapi/core/api/toast/ToastStyle;
public static final field TASK Ldev/slne/surf/surfapi/core/api/toast/ToastStyle;
public static fun getEntries ()Lkotlin/enums/EnumEntries;
public static fun valueOf (Ljava/lang/String;)Ldev/slne/surf/surfapi/core/api/toast/ToastStyle;
public static fun values ()[Ldev/slne/surf/surfapi/core/api/toast/ToastStyle;
}

public abstract interface class dev/slne/surf/surfapi/core/api/util/ByEnum {
public abstract fun value ()Ljava/lang/Object;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package dev.slne.surf.surfapi.core.api.toast

import com.github.retrooper.packetevents.protocol.item.type.ItemType
import net.kyori.adventure.text.Component
import java.util.*

interface Toast {
val icon: ItemType
val text: Component
val style: ToastStyle

fun send(player: UUID)
Copy link
Contributor

Choose a reason for hiding this comment

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

Hier dann ein Player Objekt

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package dev.slne.surf.surfapi.core.api.toast

import com.github.retrooper.packetevents.protocol.item.type.ItemType
import com.github.retrooper.packetevents.protocol.item.type.ItemTypes
import dev.slne.surf.surfapi.core.api.messages.builder.SurfComponentBuilder

class ToastBuilder {
private var icon: ItemType = ItemTypes.STONE
private var text: SurfComponentBuilder.() -> Unit = {}
private var style: ToastStyle = ToastStyle.TASK

fun icon(itemType: ItemType) {
this.icon = itemType
}

fun text(block: SurfComponentBuilder.() -> Unit) {
this.text = block
}

fun style(style: ToastStyle) {
this.style = style
}

fun build() = ToastService.INSTANCE.createToast(
icon,
SurfComponentBuilder().apply(text).build(),
style
)
}

fun toast(block: ToastBuilder.() -> Unit): Toast {
return ToastBuilder().apply(block).build()
}

Loading