From fe90940047b1e2b45afc3f8281f0626f1f0f67e6 Mon Sep 17 00:00:00 2001 From: NicoNeko Date: Tue, 10 Feb 2026 16:03:09 +0200 Subject: [PATCH 1/2] Add luckperms integration --- core/common/build.gradle.kts | 1 + .../libreforge/LibreforgeSpigotPlugin.kt | 8 ++- .../luckperms/LuckPermsIntegration.kt | 26 +++++++++ .../impl/ConditionLuckPermHasPermission.kt | 30 ++++++++++ .../impl/EffectLuckPermGivePermission.kt | 56 +++++++++++++++++++ core/common/src/main/resources/plugin.yml | 1 + 6 files changed, 119 insertions(+), 3 deletions(-) create mode 100644 core/common/src/main/kotlin/com/willfp/libreforge/integrations/luckperms/LuckPermsIntegration.kt create mode 100644 core/common/src/main/kotlin/com/willfp/libreforge/integrations/luckperms/impl/ConditionLuckPermHasPermission.kt create mode 100644 core/common/src/main/kotlin/com/willfp/libreforge/integrations/luckperms/impl/EffectLuckPermGivePermission.kt diff --git a/core/common/build.gradle.kts b/core/common/build.gradle.kts index a0e167fd..5a9da09e 100644 --- a/core/common/build.gradle.kts +++ b/core/common/build.gradle.kts @@ -42,6 +42,7 @@ dependencies { compileOnly("com.nexomc:nexo:1.17.0") { exclude(group = "*", module = "*") } + compileOnly("net.luckperms:api:5.4") compileOnly(fileTree("../../lib") { include("*.jar") diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/LibreforgeSpigotPlugin.kt b/core/common/src/main/kotlin/com/willfp/libreforge/LibreforgeSpigotPlugin.kt index 42054d55..ef790d90 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/LibreforgeSpigotPlugin.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/LibreforgeSpigotPlugin.kt @@ -21,6 +21,8 @@ import com.willfp.libreforge.integrations.aureliumskills.AureliumSkillsIntegrati import com.willfp.libreforge.integrations.axplugins.axenvoy.AxEnvoyIntegration import com.willfp.libreforge.integrations.axplugins.axtrade.AxTradeIntegration import com.willfp.libreforge.integrations.citizens.CitizensIntegration +import com.willfp.libreforge.integrations.custom_blocks.nexo.NexoIntegration +import com.willfp.libreforge.integrations.custom_blocks.oraxen.OraxenIntegration import com.willfp.libreforge.integrations.custombiomes.impl.CustomBiomesTerra import com.willfp.libreforge.integrations.custombiomes.impl.CustomBiomesTerraformGenerator import com.willfp.libreforge.integrations.edprisoncore.EdPrisonCoreIntegration @@ -30,11 +32,10 @@ import com.willfp.libreforge.integrations.huskintegration.husktowns.HuskTownsInt import com.willfp.libreforge.integrations.jobs.JobsIntegration import com.willfp.libreforge.integrations.lands.LandsIntegration import com.willfp.libreforge.integrations.levelledmobs.LevelledMobsIntegration +import com.willfp.libreforge.integrations.luckperms.LuckPermsIntegration import com.willfp.libreforge.integrations.mcmmo.McMMOIntegration import com.willfp.libreforge.integrations.modelengine.ModelEngineIntegration import com.willfp.libreforge.integrations.mythicmobs.MythicMobsIntegration -import com.willfp.libreforge.integrations.custom_blocks.nexo.NexoIntegration -import com.willfp.libreforge.integrations.custom_blocks.oraxen.OraxenIntegration import com.willfp.libreforge.integrations.paper.PaperIntegration import com.willfp.libreforge.integrations.purpur.PurpurIntegration import com.willfp.libreforge.integrations.scyther.ScytherIntegration @@ -234,7 +235,8 @@ class LibreforgeSpigotPlugin : EcoPlugin() { IntegrationLoader("EdPrison") { EdPrisonCoreIntegration.load(this) }, IntegrationLoader("MythicMobs") { MythicMobsIntegration.load(this) }, IntegrationLoader("Nexo") { NexoIntegration.load(this) }, - IntegrationLoader("Oraxen") { OraxenIntegration.load(this)} + IntegrationLoader("Oraxen") { OraxenIntegration.load(this) }, + IntegrationLoader("LuckPerms") { LuckPermsIntegration.load(this) } ) } diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/integrations/luckperms/LuckPermsIntegration.kt b/core/common/src/main/kotlin/com/willfp/libreforge/integrations/luckperms/LuckPermsIntegration.kt new file mode 100644 index 00000000..5079c0fa --- /dev/null +++ b/core/common/src/main/kotlin/com/willfp/libreforge/integrations/luckperms/LuckPermsIntegration.kt @@ -0,0 +1,26 @@ +package com.willfp.libreforge.integrations.luckperms + +import com.willfp.eco.core.EcoPlugin +import com.willfp.libreforge.conditions.Conditions +import com.willfp.libreforge.effects.Effects +import com.willfp.libreforge.integrations.LoadableIntegration +import com.willfp.libreforge.integrations.luckperms.impl.ConditionLuckPermHasPermission +import com.willfp.libreforge.integrations.luckperms.impl.EffectLuckPermGivePermission +import net.luckperms.api.LuckPermsProvider +import net.luckperms.api.model.user.User +import org.bukkit.entity.Player + +object LuckPermsIntegration : LoadableIntegration { + override fun load(plugin: EcoPlugin) { + Conditions.register(ConditionLuckPermHasPermission) + Effects.register(EffectLuckPermGivePermission) + } + + override fun getPluginName(): String { + return "LuckPerms" + } + + fun Player.getLuckPermsUser(): User? { + return LuckPermsProvider.get().userManager.getUser(uniqueId) + } +} diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/integrations/luckperms/impl/ConditionLuckPermHasPermission.kt b/core/common/src/main/kotlin/com/willfp/libreforge/integrations/luckperms/impl/ConditionLuckPermHasPermission.kt new file mode 100644 index 00000000..4b5d13cf --- /dev/null +++ b/core/common/src/main/kotlin/com/willfp/libreforge/integrations/luckperms/impl/ConditionLuckPermHasPermission.kt @@ -0,0 +1,30 @@ +package com.willfp.libreforge.integrations.luckperms.impl + +import com.willfp.eco.core.config.interfaces.Config +import com.willfp.libreforge.Dispatcher +import com.willfp.libreforge.NoCompileData +import com.willfp.libreforge.ProvidedHolder +import com.willfp.libreforge.arguments +import com.willfp.libreforge.conditions.Condition +import com.willfp.libreforge.get +import com.willfp.libreforge.integrations.luckperms.LuckPermsIntegration.getLuckPermsUser +import org.bukkit.entity.Player + +object ConditionLuckPermHasPermission : Condition("has_permission") { + override val arguments = arguments { + require("permission", "You must specify the permission!") + } + + override fun isMet( + dispatcher: Dispatcher<*>, + config: Config, + holder: ProvidedHolder, + compileData: NoCompileData + ): Boolean { + val player = dispatcher.get() ?: return false + + val user = player.getLuckPermsUser() ?: return false + + return user.cachedData.permissionData.checkPermission(config.getString("permission")).asBoolean() + } +} \ No newline at end of file diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/integrations/luckperms/impl/EffectLuckPermGivePermission.kt b/core/common/src/main/kotlin/com/willfp/libreforge/integrations/luckperms/impl/EffectLuckPermGivePermission.kt new file mode 100644 index 00000000..f2ead1ff --- /dev/null +++ b/core/common/src/main/kotlin/com/willfp/libreforge/integrations/luckperms/impl/EffectLuckPermGivePermission.kt @@ -0,0 +1,56 @@ +package com.willfp.libreforge.integrations.luckperms.impl + +import com.willfp.eco.core.config.interfaces.Config +import com.willfp.eco.core.map.listMap +import com.willfp.libreforge.Dispatcher +import com.willfp.libreforge.NoCompileData +import com.willfp.libreforge.ProvidedHolder +import com.willfp.libreforge.arguments +import com.willfp.libreforge.effects.Effect +import com.willfp.libreforge.effects.Identifiers +import com.willfp.libreforge.get +import com.willfp.libreforge.integrations.luckperms.LuckPermsIntegration.getLuckPermsUser +import net.luckperms.api.node.types.PermissionNode +import org.bukkit.entity.Player +import java.util.UUID + +object EffectLuckPermGivePermission : Effect("give_permission") { + override val arguments = arguments { + require("permission", "You must specify the permission!") + } + + private val permissions = listMap() + + override fun onEnable( + dispatcher: Dispatcher<*>, + config: Config, + identifiers: Identifiers, + holder: ProvidedHolder, + compileData: NoCompileData + ) { + val player = dispatcher.get() ?: return + val user = player.getLuckPermsUser() ?: return + val permission = config.getString("permission") + + val node = PermissionNode.builder(permission).value(true).build() + + permissions[player.uniqueId].add(GivenPermission(node, player.uniqueId)) + user.data().add(node) + } + + override fun onDisable(dispatcher: Dispatcher<*>, identifiers: Identifiers, holder: ProvidedHolder) { + val player = dispatcher.get() ?: return + val user = player.getLuckPermsUser() ?: return + + val givenPermission = permissions[player.uniqueId] + .firstOrNull { it.uuid == identifiers.uuid } ?: return + + permissions[player.uniqueId].remove(givenPermission) + user.data().remove(givenPermission.node) + } + + private data class GivenPermission( + val node: PermissionNode, + val uuid: UUID + ) +} \ No newline at end of file diff --git a/core/common/src/main/resources/plugin.yml b/core/common/src/main/resources/plugin.yml index 31b9661f..7e3771c6 100644 --- a/core/common/src/main/resources/plugin.yml +++ b/core/common/src/main/resources/plugin.yml @@ -37,6 +37,7 @@ softdepend: - CustomFishing - Lands - EdPrison + - LuckPerms commands: lrcdb: From 06f543613086e3e32f56bda1f6a59956cd69cec1 Mon Sep 17 00:00:00 2001 From: NicoNeko Date: Tue, 10 Mar 2026 20:11:58 +0200 Subject: [PATCH 2/2] Fix give_permission not saving the permission --- .../libreforge/integrations/luckperms/LuckPermsIntegration.kt | 4 ++++ .../luckperms/impl/EffectLuckPermGivePermission.kt | 3 +++ 2 files changed, 7 insertions(+) diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/integrations/luckperms/LuckPermsIntegration.kt b/core/common/src/main/kotlin/com/willfp/libreforge/integrations/luckperms/LuckPermsIntegration.kt index 5079c0fa..4fc3c84d 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/integrations/luckperms/LuckPermsIntegration.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/integrations/luckperms/LuckPermsIntegration.kt @@ -23,4 +23,8 @@ object LuckPermsIntegration : LoadableIntegration { fun Player.getLuckPermsUser(): User? { return LuckPermsProvider.get().userManager.getUser(uniqueId) } + + fun User.saveChanges() { + LuckPermsProvider.get().userManager.saveUser(this) + } } diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/integrations/luckperms/impl/EffectLuckPermGivePermission.kt b/core/common/src/main/kotlin/com/willfp/libreforge/integrations/luckperms/impl/EffectLuckPermGivePermission.kt index f2ead1ff..2fcd32c1 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/integrations/luckperms/impl/EffectLuckPermGivePermission.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/integrations/luckperms/impl/EffectLuckPermGivePermission.kt @@ -10,6 +10,7 @@ import com.willfp.libreforge.effects.Effect import com.willfp.libreforge.effects.Identifiers import com.willfp.libreforge.get import com.willfp.libreforge.integrations.luckperms.LuckPermsIntegration.getLuckPermsUser +import com.willfp.libreforge.integrations.luckperms.LuckPermsIntegration.saveChanges import net.luckperms.api.node.types.PermissionNode import org.bukkit.entity.Player import java.util.UUID @@ -36,6 +37,7 @@ object EffectLuckPermGivePermission : Effect("give_permission") { permissions[player.uniqueId].add(GivenPermission(node, player.uniqueId)) user.data().add(node) + user.saveChanges() } override fun onDisable(dispatcher: Dispatcher<*>, identifiers: Identifiers, holder: ProvidedHolder) { @@ -47,6 +49,7 @@ object EffectLuckPermGivePermission : Effect("give_permission") { permissions[player.uniqueId].remove(givenPermission) user.data().remove(givenPermission.node) + user.saveChanges() } private data class GivenPermission(