diff --git a/Essentials/pom.xml b/Essentials/pom.xml
index 98be2eb86..e18d0b618 100644
--- a/Essentials/pom.xml
+++ b/Essentials/pom.xml
@@ -54,6 +54,12 @@
1.7
provided
+
+ net.luckperms
+ api
+ 5.0
+ provided
+
io.papermc
paperlib
diff --git a/Essentials/src/com/earth2me/essentials/Essentials.java b/Essentials/src/com/earth2me/essentials/Essentials.java
index 7a9a957c6..95b13c971 100644
--- a/Essentials/src/com/earth2me/essentials/Essentials.java
+++ b/Essentials/src/com/earth2me/essentials/Essentials.java
@@ -391,6 +391,9 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials {
if (backup != null) {
backup.stopTask();
}
+
+ this.getPermissionsHandler().unregisterContexts();
+
Economy.setEss(null);
Trade.closeLog();
getUserMap().getUUIDMap().shutdown();
diff --git a/Essentials/src/com/earth2me/essentials/EssentialsPluginListener.java b/Essentials/src/com/earth2me/essentials/EssentialsPluginListener.java
index d7543cdc8..ddda2343f 100644
--- a/Essentials/src/com/earth2me/essentials/EssentialsPluginListener.java
+++ b/Essentials/src/com/earth2me/essentials/EssentialsPluginListener.java
@@ -36,6 +36,7 @@ public class EssentialsPluginListener implements Listener, IConf {
if (event.getPlugin().getName().equals("EssentialsChat")) {
ess.getSettings().setEssentialsChatActive(false);
}
+ ess.getPermissionsHandler().checkPermissions();
ess.getAlternativeCommandsHandler().removePlugin(event.getPlugin());
// Check to see if the plugin thats being disabled is the one we are using
if (ess.getPaymentMethod() != null && Methods.hasMethod() && Methods.checkDisabled(event.getPlugin())) {
diff --git a/Essentials/src/com/earth2me/essentials/perm/IPermissionsHandler.java b/Essentials/src/com/earth2me/essentials/perm/IPermissionsHandler.java
index e0d50a10d..f5cccf740 100644
--- a/Essentials/src/com/earth2me/essentials/perm/IPermissionsHandler.java
+++ b/Essentials/src/com/earth2me/essentials/perm/IPermissionsHandler.java
@@ -3,6 +3,8 @@ package com.earth2me.essentials.perm;
import org.bukkit.entity.Player;
import java.util.List;
+import java.util.function.Function;
+import java.util.function.Supplier;
public interface IPermissionsHandler {
@@ -23,5 +25,9 @@ public interface IPermissionsHandler {
String getSuffix(Player base);
+ void registerContext(String context, Function> calculator, Supplier> suggestions);
+
+ void unregisterContexts();
+
boolean tryProvider();
}
diff --git a/Essentials/src/com/earth2me/essentials/perm/PermissionsHandler.java b/Essentials/src/com/earth2me/essentials/perm/PermissionsHandler.java
index 847164f25..7a6d5665a 100644
--- a/Essentials/src/com/earth2me/essentials/perm/PermissionsHandler.java
+++ b/Essentials/src/com/earth2me/essentials/perm/PermissionsHandler.java
@@ -2,11 +2,14 @@ package com.earth2me.essentials.perm;
import com.earth2me.essentials.Essentials;
import com.earth2me.essentials.perm.impl.*;
+import com.google.common.collect.ImmutableSet;
import org.bukkit.entity.Player;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
+import java.util.function.Function;
+import java.util.function.Supplier;
import java.util.logging.Level;
public class PermissionsHandler implements IPermissionsHandler {
@@ -89,6 +92,16 @@ public class PermissionsHandler implements IPermissionsHandler {
return suffix;
}
+ @Override
+ public void registerContext(String context, Function> calculator, Supplier> suggestions) {
+ handler.registerContext(context, calculator, suggestions);
+ }
+
+ @Override
+ public void unregisterContexts() {
+ handler.unregisterContexts();
+ }
+
@Override
public boolean tryProvider() {
return true;
@@ -97,6 +110,7 @@ public class PermissionsHandler implements IPermissionsHandler {
public void checkPermissions() {
// load and assign a handler
List> providerClazz = Arrays.asList(
+ LuckPermsHandler.class,
ModernVaultHandler.class,
GenericVaultHandler.class,
SuperpermsHandler.class
@@ -105,7 +119,14 @@ public class PermissionsHandler implements IPermissionsHandler {
try {
IPermissionsHandler provider = providerClass.newInstance();
if (provider.tryProvider()) {
+ if (provider.getClass().isInstance(this.handler)) {
+ return;
+ }
+ if (this.handler != null) {
+ unregisterContexts();
+ }
this.handler = provider;
+ initContexts();
break;
}
} catch (Throwable ignored) {
@@ -160,4 +181,10 @@ public class PermissionsHandler implements IPermissionsHandler {
}
}
+ private void initContexts() {
+ registerContext("essentials:afk", player -> Collections.singleton(String.valueOf(ess.getUser(player).isAfk())), () -> ImmutableSet.of("true", "false"));
+ registerContext("essentials:muted", player -> Collections.singleton(String.valueOf(ess.getUser(player).isMuted())), () -> ImmutableSet.of("true", "false"));
+ registerContext("essentials:vanished", player -> Collections.singleton(String.valueOf(ess.getUser(player).isHidden())), () -> ImmutableSet.of("true", "false"));
+ }
+
}
diff --git a/Essentials/src/com/earth2me/essentials/perm/impl/LuckPermsHandler.java b/Essentials/src/com/earth2me/essentials/perm/impl/LuckPermsHandler.java
new file mode 100644
index 000000000..98dbe6fbd
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/perm/impl/LuckPermsHandler.java
@@ -0,0 +1,55 @@
+package com.earth2me.essentials.perm.impl;
+
+import net.luckperms.api.LuckPerms;
+import net.luckperms.api.context.ContextCalculator;
+import net.luckperms.api.context.ContextConsumer;
+import net.luckperms.api.context.ContextSet;
+import net.luckperms.api.context.ImmutableContextSet;
+import org.bukkit.Bukkit;
+import org.bukkit.entity.Player;
+import org.bukkit.plugin.RegisteredServiceProvider;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.function.Function;
+import java.util.function.Supplier;
+
+public class LuckPermsHandler extends ModernVaultHandler {
+ private LuckPerms luckPerms;
+ private Set> contextCalculators;
+
+ @Override
+ public void registerContext(String context, Function> calculator, Supplier> suggestions) {
+ ContextCalculator contextCalculator = new ContextCalculator() {
+ @Override
+ public void calculate(Player target, ContextConsumer consumer) {
+ calculator.apply(target).forEach(value -> consumer.accept(context, value));
+ }
+
+ @Override
+ public ContextSet estimatePotentialContexts() {
+ ImmutableContextSet.Builder builder = ImmutableContextSet.builder();
+ suggestions.get().forEach(value -> builder.add(context, value));
+ return builder.build();
+ }
+ };
+ luckPerms.getContextManager().registerCalculator(contextCalculator);
+ contextCalculators.add(contextCalculator);
+ }
+
+ @Override
+ public void unregisterContexts() {
+ contextCalculators.forEach(contextCalculator -> luckPerms.getContextManager().unregisterCalculator(contextCalculator));
+ contextCalculators.clear();
+ }
+
+ @Override
+ public boolean tryProvider() {
+ RegisteredServiceProvider provider = Bukkit.getServicesManager().getRegistration(LuckPerms.class);
+ if (provider != null) {
+ luckPerms = provider.getProvider();
+ contextCalculators = new HashSet<>();
+ }
+ return luckPerms != null && super.tryProvider();
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/perm/impl/SuperpermsHandler.java b/Essentials/src/com/earth2me/essentials/perm/impl/SuperpermsHandler.java
index fa7a67e17..e8aa7da86 100644
--- a/Essentials/src/com/earth2me/essentials/perm/impl/SuperpermsHandler.java
+++ b/Essentials/src/com/earth2me/essentials/perm/impl/SuperpermsHandler.java
@@ -7,6 +7,8 @@ import org.bukkit.plugin.Plugin;
import java.util.Arrays;
import java.util.List;
+import java.util.function.Function;
+import java.util.function.Supplier;
public class SuperpermsHandler implements IPermissionsHandler {
@@ -72,6 +74,14 @@ public class SuperpermsHandler implements IPermissionsHandler {
return null;
}
+ @Override
+ public void registerContext(String context, Function> calculator, Supplier> suggestions) {
+ }
+
+ @Override
+ public void unregisterContexts() {
+ }
+
@Override
public boolean tryProvider() {
return getEnabledPermsPlugin() != null;
diff --git a/Essentials/src/plugin.yml b/Essentials/src/plugin.yml
index 622f69deb..e0244a123 100644
--- a/Essentials/src/plugin.yml
+++ b/Essentials/src/plugin.yml
@@ -5,7 +5,7 @@ main: com.earth2me.essentials.Essentials
version: ${full.version}
website: http://tiny.cc/EssentialsCommands
description: Provides an essential, core set of commands for Bukkit.
-softdepend: [Vault]
+softdepend: [Vault, LuckPerms]
authors: [Zenexer, ementalo, Aelux, Brettflan, KimKandor, snowleo, ceulemans, Xeology, KHobbits, md_5, Iaccidentally, drtshock, vemacs, SupaHam, md678685]
api-version: "1.13"
commands: