From 640864f3cee72366243feff769964d5a6899fc19 Mon Sep 17 00:00:00 2001 From: twisti-dev <76837088+twisti-dev@users.noreply.github.com> Date: Sat, 6 Jun 2026 21:59:56 +0200 Subject: [PATCH 1/3] =?UTF-8?q?=E2=9C=A8=20feat(loottable):=20add=20rollLo?= =?UTF-8?q?otTable=20method=20for=20loot=20generation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - implement rollLootTable to generate loot based on entity and damage source - utilize LootParams for contextual loot generation --- ...V1_21_11SurfPaperNmsLootTableBridgeImpl.kt | 32 +++++++++++++++++++ .../V26_1SurfPaperNmsLootTableBridgeImpl.kt | 32 +++++++++++++++++++ .../bridges/SurfPaperNmsLootTableBridge.kt | 6 ++++ 3 files changed, 70 insertions(+) diff --git a/surf-api-paper/surf-api-paper-nms/surf-api-paper-nms-v1-21-11/src/main/kotlin/dev/slne/surf/api/paper/server/nms/v1_21_11/bridges/V1_21_11SurfPaperNmsLootTableBridgeImpl.kt b/surf-api-paper/surf-api-paper-nms/surf-api-paper-nms-v1-21-11/src/main/kotlin/dev/slne/surf/api/paper/server/nms/v1_21_11/bridges/V1_21_11SurfPaperNmsLootTableBridgeImpl.kt index df9a5041a..2449e0b0f 100644 --- a/surf-api-paper/surf-api-paper-nms/surf-api-paper-nms-v1-21-11/src/main/kotlin/dev/slne/surf/api/paper/server/nms/v1_21_11/bridges/V1_21_11SurfPaperNmsLootTableBridgeImpl.kt +++ b/surf-api-paper/surf-api-paper-nms/surf-api-paper-nms-v1-21-11/src/main/kotlin/dev/slne/surf/api/paper/server/nms/v1_21_11/bridges/V1_21_11SurfPaperNmsLootTableBridgeImpl.kt @@ -52,4 +52,36 @@ class V1_21_11SurfPaperNmsLootTableBridgeImpl : SurfPaperNmsLootTableBridge { return lootTable.getRandomItems(lootParams, nmsEntity.lootTableSeed) .mapTo(mutableObjectListOf()) { it.toBukkit() } } + + override fun rollLootTable( + entity: LivingEntity, + damageSource: DamageSource, + causedByPlayer: Boolean + ): Collection { + val nmsEntity = entity.toNms() + val lootTableKey = nmsEntity.lootTable.getOrNull() ?: return emptyObjectList() + val lootTable = MinecraftServer.getServer().reloadableRegistries().getLootTable(lootTableKey) + val nmsDamageSource = damageSource.toNms() + + val paramBuilder = LootParams.Builder(nmsEntity.level() as ServerLevel) + .withParameter(LootContextParams.THIS_ENTITY, nmsEntity) + .withParameter(LootContextParams.ORIGIN, nmsEntity.position()) + .withParameter(LootContextParams.DAMAGE_SOURCE, nmsDamageSource) + .withOptionalParameter(LootContextParams.ATTACKING_ENTITY, nmsDamageSource.entity) + .withOptionalParameter( + LootContextParams.DIRECT_ATTACKING_ENTITY, + nmsDamageSource.directEntity + ) + + val lastHurtByPlayer = nmsEntity.getLastHurtByPlayer() + if (causedByPlayer && lastHurtByPlayer != null) { + paramBuilder.withParameter(LootContextParams.LAST_DAMAGE_PLAYER, lastHurtByPlayer) + .withLuck(lastHurtByPlayer.luck) + } + + val lootParams = paramBuilder.create(LootContextParamSets.ENTITY) + + return lootTable.getRandomItems(lootParams, nmsEntity.lootTableSeed) + .mapTo(mutableObjectListOf()) { it.toBukkit() } + } } diff --git a/surf-api-paper/surf-api-paper-nms/surf-api-paper-nms-v26-1/src/main/kotlin/dev/slne/surf/api/paper/server/nms/v26_1/bridges/V26_1SurfPaperNmsLootTableBridgeImpl.kt b/surf-api-paper/surf-api-paper-nms/surf-api-paper-nms-v26-1/src/main/kotlin/dev/slne/surf/api/paper/server/nms/v26_1/bridges/V26_1SurfPaperNmsLootTableBridgeImpl.kt index a08e77409..8ed8d2030 100644 --- a/surf-api-paper/surf-api-paper-nms/surf-api-paper-nms-v26-1/src/main/kotlin/dev/slne/surf/api/paper/server/nms/v26_1/bridges/V26_1SurfPaperNmsLootTableBridgeImpl.kt +++ b/surf-api-paper/surf-api-paper-nms/surf-api-paper-nms-v26-1/src/main/kotlin/dev/slne/surf/api/paper/server/nms/v26_1/bridges/V26_1SurfPaperNmsLootTableBridgeImpl.kt @@ -53,4 +53,36 @@ class V26_1SurfPaperNmsLootTableBridgeImpl : SurfPaperNmsLootTableBridge { return lootTable.getRandomItems(lootParams, nmsEntity.lootTableSeed) .mapTo(mutableObjectListOf()) { it.toBukkit() } } + + override fun rollLootTable( + entity: LivingEntity, + damageSource: DamageSource, + causedByPlayer: Boolean + ): Collection { + val nmsEntity = entity.toNms() + val lootTableKey = nmsEntity.lootTable.getOrNull() ?: return emptyObjectList() + val lootTable = MinecraftServer.getServer().reloadableRegistries().getLootTable(lootTableKey) + val nmsDamageSource = damageSource.toNms() + + val paramBuilder = LootParams.Builder(nmsEntity.level() as ServerLevel) + .withParameter(LootContextParams.THIS_ENTITY, nmsEntity) + .withParameter(LootContextParams.ORIGIN, nmsEntity.position()) + .withParameter(LootContextParams.DAMAGE_SOURCE, nmsDamageSource) + .withOptionalParameter(LootContextParams.ATTACKING_ENTITY, nmsDamageSource.entity) + .withOptionalParameter( + LootContextParams.DIRECT_ATTACKING_ENTITY, + nmsDamageSource.directEntity + ) + + val lastHurtByPlayer = nmsEntity.getLastHurtByPlayer() + if (causedByPlayer && lastHurtByPlayer != null) { + paramBuilder.withParameter(LootContextParams.LAST_DAMAGE_PLAYER, lastHurtByPlayer) + .withLuck(lastHurtByPlayer.luck) + } + + val lootParams = paramBuilder.create(LootContextParamSets.ENTITY) + + return lootTable.getRandomItems(lootParams, nmsEntity.lootTableSeed) + .mapTo(mutableObjectListOf()) { it.toBukkit() } + } } diff --git a/surf-api-paper/surf-api-paper/src/main/kotlin/dev/slne/surf/api/paper/nms/bridges/SurfPaperNmsLootTableBridge.kt b/surf-api-paper/surf-api-paper/src/main/kotlin/dev/slne/surf/api/paper/nms/bridges/SurfPaperNmsLootTableBridge.kt index ce56776c1..7463b09d2 100644 --- a/surf-api-paper/surf-api-paper/src/main/kotlin/dev/slne/surf/api/paper/nms/bridges/SurfPaperNmsLootTableBridge.kt +++ b/surf-api-paper/surf-api-paper/src/main/kotlin/dev/slne/surf/api/paper/nms/bridges/SurfPaperNmsLootTableBridge.kt @@ -17,6 +17,12 @@ interface SurfPaperNmsLootTableBridge { causedByPlayer: Boolean, ): Collection + fun rollLootTable( + entity: LivingEntity, + damageSource: DamageSource, + causedByPlayer: Boolean, + ): Collection + companion object : SurfPaperNmsLootTableBridge by bridge { val INSTANCE get() = bridge } From db311697737b719e53a5a5ed8e63418e5a473449 Mon Sep 17 00:00:00 2001 From: twisti-dev <76837088+twisti-dev@users.noreply.github.com> Date: Sat, 6 Jun 2026 22:00:17 +0200 Subject: [PATCH 2/3] =?UTF-8?q?```=20=F0=9F=94=A7=20chore:=20update=20vers?= =?UTF-8?q?ion=20to=203.18.0=20```?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index ead2e85bf..74ecc98a3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,6 +7,6 @@ org.jetbrains.dokka.experimental.gradle.pluginMode=V2Enabled javaVersion=25 mcVersion=26.1.2 group=dev.slne.surf.api -version=3.17.2 +version=3.18.0 relocationPrefix=dev.slne.surf.api.libs snapshot=false From 16e935a5557fcd96946501c7ad749bf20d4e51b3 Mon Sep 17 00:00:00 2001 From: twisti-dev <76837088+twisti-dev@users.noreply.github.com> Date: Sat, 6 Jun 2026 22:02:22 +0200 Subject: [PATCH 3/3] =?UTF-8?q?=F0=9F=94=A7=20chore(abi):=20update=20api?= =?UTF-8?q?=20dump?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- surf-api-paper/surf-api-paper/api/surf-api-paper.api | 2 ++ 1 file changed, 2 insertions(+) diff --git a/surf-api-paper/surf-api-paper/api/surf-api-paper.api b/surf-api-paper/surf-api-paper/api/surf-api-paper.api index 492969993..0d2a6892c 100644 --- a/surf-api-paper/surf-api-paper/api/surf-api-paper.api +++ b/surf-api-paper/surf-api-paper/api/surf-api-paper.api @@ -1703,11 +1703,13 @@ public final class dev/slne/surf/api/paper/nms/bridges/SurfPaperNmsItemBridge$Co public abstract interface class dev/slne/surf/api/paper/nms/bridges/SurfPaperNmsLootTableBridge { public static final field Companion Ldev/slne/surf/api/paper/nms/bridges/SurfPaperNmsLootTableBridge$Companion; public abstract fun getDifferentLootTable (Lorg/bukkit/entity/LivingEntity;Lorg/bukkit/damage/DamageSource;Lorg/bukkit/entity/EntityType;Z)Ljava/util/Collection; + public abstract fun rollLootTable (Lorg/bukkit/entity/LivingEntity;Lorg/bukkit/damage/DamageSource;Z)Ljava/util/Collection; } public final class dev/slne/surf/api/paper/nms/bridges/SurfPaperNmsLootTableBridge$Companion : dev/slne/surf/api/paper/nms/bridges/SurfPaperNmsLootTableBridge { public fun getDifferentLootTable (Lorg/bukkit/entity/LivingEntity;Lorg/bukkit/damage/DamageSource;Lorg/bukkit/entity/EntityType;Z)Ljava/util/Collection; public final fun getINSTANCE ()Ldev/slne/surf/api/paper/nms/bridges/SurfPaperNmsLootTableBridge; + public fun rollLootTable (Lorg/bukkit/entity/LivingEntity;Lorg/bukkit/damage/DamageSource;Z)Ljava/util/Collection; } public abstract interface class dev/slne/surf/api/paper/nms/bridges/SurfPaperNmsNbtBridge {