diff --git a/gradle.properties b/gradle.properties index ead2e85b..74ecc98a 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 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 df9a5041..2449e0b0 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 a08e7740..8ed8d203 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/api/surf-api-paper.api b/surf-api-paper/surf-api-paper/api/surf-api-paper.api index 49296999..0d2a6892 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 { 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 ce56776c..7463b09d 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 }