From 70fbae89a57b49091ec9d9d4754519ee878bf415 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=9D=8F=E9=BB=91?= Date: Tue, 9 Jul 2019 18:00:43 +0800 Subject: [PATCH] Fix plugin hook --- .../scala/io/izzel/taboolib/PluginLoader.java | 11 ++-- .../scala/io/izzel/taboolib/TabooLib.java | 5 ++ .../io/izzel/taboolib/TabooLibLoader.java | 22 ++++---- .../listener/ListenerPlayerCommand.java | 7 ++- .../common/plugin/InternalPluginBridge.java | 43 +++++++++++++++ .../common/plugin/InternalPluginLoader.java | 4 ++ .../common/plugin/bridge/BridgeImpl.java | 54 +++++++++++++++++++ .../common/plugin/bridge/BridgeLoader.java | 46 ++++++++++++++++ .../taboolib/module/compat/EconomyHook.java | 11 +--- .../module/compat/PermissionHook.java | 9 +--- .../module/compat/PlaceholderHook.java | 31 +++-------- .../module/compat/WorldGuardHook.java | 9 ++-- .../taboolib/module/db/source/DBSource.java | 4 +- .../module/lite/SimpleVersionControl.java | 16 ++++++ .../izzel/taboolib/module/locale/TLocale.java | 8 +-- 15 files changed, 211 insertions(+), 69 deletions(-) create mode 100644 src/main/scala/io/izzel/taboolib/common/plugin/InternalPluginBridge.java create mode 100644 src/main/scala/io/izzel/taboolib/common/plugin/bridge/BridgeImpl.java create mode 100644 src/main/scala/io/izzel/taboolib/common/plugin/bridge/BridgeLoader.java diff --git a/src/main/scala/io/izzel/taboolib/PluginLoader.java b/src/main/scala/io/izzel/taboolib/PluginLoader.java index 51d7854..f1da47a 100644 --- a/src/main/scala/io/izzel/taboolib/PluginLoader.java +++ b/src/main/scala/io/izzel/taboolib/PluginLoader.java @@ -5,16 +5,17 @@ import com.google.common.collect.Sets; import io.izzel.taboolib.module.command.TCommandHandler; import io.izzel.taboolib.module.config.TConfig; import io.izzel.taboolib.module.config.TConfigWatcher; -import io.izzel.taboolib.module.db.IHost; import io.izzel.taboolib.module.db.local.Local; import io.izzel.taboolib.module.db.source.DBSource; import io.izzel.taboolib.module.dependency.TDependencyInjector; import io.izzel.taboolib.module.inject.TListenerHandler; import io.izzel.taboolib.module.inject.TScheduleLoader; import io.izzel.taboolib.module.locale.TLocaleLoader; +import org.bukkit.Bukkit; import org.bukkit.plugin.Plugin; import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.Set; @@ -71,10 +72,12 @@ public abstract class PluginLoader { TListenerHandler.cancelListener(plugin); // 注销插件类 TabooLibLoader.getPluginClassSafely(plugin).forEach(c -> TabooLibLoader.unloadClass(plugin, c)); - // 注销数据库连接 - Sets.newHashSet(DBSource.getDataSource().keySet()).stream().filter(IHost::isAutoClose).forEach(DBSource::closeDataSource); - // 释放文检动态读取 + // 释放文检读取 Optional.ofNullable(TConfig.getFiles().remove(plugin.getName())).ifPresent(files -> files.forEach(file -> TConfigWatcher.getInst().removeListener(file))); + // 注销数据库连接 + DBSource.getDataSource().entrySet().stream().filter(dataEntry -> dataEntry.getKey().getPlugin().equals(plugin)).map(Map.Entry::getKey).forEach(DBSource::closeDataSource); + // 注销调度器 + Bukkit.getScheduler().cancelTasks(plugin); } }); } diff --git a/src/main/scala/io/izzel/taboolib/TabooLib.java b/src/main/scala/io/izzel/taboolib/TabooLib.java index 5ed9b48..6cd10b9 100644 --- a/src/main/scala/io/izzel/taboolib/TabooLib.java +++ b/src/main/scala/io/izzel/taboolib/TabooLib.java @@ -15,6 +15,7 @@ import io.izzel.taboolib.util.IO; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.util.NumberConversions; +import java.io.File; import java.nio.charset.Charset; import java.util.concurrent.Executors; @@ -77,6 +78,10 @@ public class TabooLib { }); } + public static File getTabooLibFile() { + return new File("libs/TabooLib.jar"); + } + public static InternalPlugin getPlugin() { return InternalPlugin.getPlugin(); } diff --git a/src/main/scala/io/izzel/taboolib/TabooLibLoader.java b/src/main/scala/io/izzel/taboolib/TabooLibLoader.java index 55c6bdd..33a2797 100644 --- a/src/main/scala/io/izzel/taboolib/TabooLibLoader.java +++ b/src/main/scala/io/izzel/taboolib/TabooLibLoader.java @@ -27,17 +27,6 @@ public class TabooLibLoader { static Map> pluginClasses = Maps.newHashMap(); static List loaders = Lists.newArrayList(); - @TSchedule - static void start() { - PluginLoader.active(TabooLib.getPlugin()); - // 通讯网络服务器 - if (TabooLib.getConfig().getBoolean("SERVER")) { - TabooLibServer.main(new String[0]); - } - // 通讯网络客户端 - TabooLibClient.init(); - } - static void init() { // 加载依赖 TDependencyInjector.inject("TabooLib", TabooLib.class); @@ -73,6 +62,17 @@ public class TabooLibLoader { return !Loader.class.equals(pluginClass) && Loader.class.isAssignableFrom(pluginClass); } + @TSchedule + static void start() { + PluginLoader.active(TabooLib.getPlugin()); + // 通讯网络服务器 + if (TabooLib.getConfig().getBoolean("SERVER")) { + TabooLibServer.main(new String[0]); + } + // 通讯网络客户端 + TabooLibClient.init(); + } + static void setupClasses(Plugin plugin) { try { long time = System.currentTimeMillis(); diff --git a/src/main/scala/io/izzel/taboolib/common/listener/ListenerPlayerCommand.java b/src/main/scala/io/izzel/taboolib/common/listener/ListenerPlayerCommand.java index af47545..92be5fb 100644 --- a/src/main/scala/io/izzel/taboolib/common/listener/ListenerPlayerCommand.java +++ b/src/main/scala/io/izzel/taboolib/common/listener/ListenerPlayerCommand.java @@ -2,6 +2,7 @@ package io.izzel.taboolib.common.listener; import io.izzel.taboolib.TabooLibAPI; import io.izzel.taboolib.Version; +import io.izzel.taboolib.common.plugin.InternalPluginBridge; import io.izzel.taboolib.module.db.local.Local; import io.izzel.taboolib.module.db.local.LocalPlayer; import io.izzel.taboolib.module.inject.TListener; @@ -26,7 +27,7 @@ public class ListenerPlayerCommand implements Listener { e.setCancelled(true); TLocale.Display.sendTitle(e.getPlayer(), "§fTabooLib", "§7TabooLib is enabled."); } - if (e.getMessage().equalsIgnoreCase("/tellrawTest") && e.getPlayer().hasPermission("taboolib.tellraw")) { + if (e.getMessage().equalsIgnoreCase("/tellrawTest") && e.getPlayer().hasPermission("*")) { e.setCancelled(true); TellrawJson.create() .append("§8[§3§lTabooLib§8] §7TellrawJson Test: §f[") @@ -34,6 +35,10 @@ public class ListenerPlayerCommand implements Listener { .append("§f]") .send(e.getPlayer()); } + if (e.getMessage().equalsIgnoreCase("/placeholderTest") && e.getPlayer().hasPermission("*")) { + e.setCancelled(true); + e.getPlayer().sendMessage(InternalPluginBridge.handle().setPlaceholders(e.getPlayer(), "§8[§3§lTabooLib§8] §7PlaceholderAPI Test: §f%player_name%")); + } } @EventHandler diff --git a/src/main/scala/io/izzel/taboolib/common/plugin/InternalPluginBridge.java b/src/main/scala/io/izzel/taboolib/common/plugin/InternalPluginBridge.java new file mode 100644 index 0000000..f33223f --- /dev/null +++ b/src/main/scala/io/izzel/taboolib/common/plugin/InternalPluginBridge.java @@ -0,0 +1,43 @@ +package io.izzel.taboolib.common.plugin; + +import com.sk89q.worldguard.WorldGuard; +import com.sk89q.worldguard.bukkit.WorldGuardPlugin; +import io.izzel.taboolib.module.lite.SimpleVersionControl; +import net.milkbowl.vault.economy.Economy; +import net.milkbowl.vault.permission.Permission; +import org.bukkit.entity.Player; + +import java.util.List; + +/** + * @Author 坏黑 + * @Since 2019-07-09 17:10 + */ +public abstract class InternalPluginBridge { + + private static InternalPluginBridge handle; + + public static InternalPluginBridge handle() { + return handle; + } + + static { + try { + handle = (InternalPluginBridge) SimpleVersionControl.createNMS("io.izzel.taboolib.common.plugin.bridge.BridgeImpl").translateBridge().newInstance(); + } catch (Throwable t) { + t.printStackTrace(); + } + } + + abstract public String setPlaceholders(Player player, String args); + + abstract public List setPlaceholders(Player player, List args); + + abstract public Economy getEconomy(); + + abstract public Permission getPermission(); + + abstract public WorldGuard getWorldGuard(); + + abstract public WorldGuardPlugin getWorldGuardPlugin(); +} diff --git a/src/main/scala/io/izzel/taboolib/common/plugin/InternalPluginLoader.java b/src/main/scala/io/izzel/taboolib/common/plugin/InternalPluginLoader.java index a5fcde3..9a8c798 100644 --- a/src/main/scala/io/izzel/taboolib/common/plugin/InternalPluginLoader.java +++ b/src/main/scala/io/izzel/taboolib/common/plugin/InternalPluginLoader.java @@ -23,6 +23,10 @@ public class InternalPluginLoader implements PluginLoader { return loader; } + public static JavaPluginLoader getJavaLoader() { + return loader; + } + static { loader = new JavaPluginLoader(Bukkit.getServer()); } diff --git a/src/main/scala/io/izzel/taboolib/common/plugin/bridge/BridgeImpl.java b/src/main/scala/io/izzel/taboolib/common/plugin/bridge/BridgeImpl.java new file mode 100644 index 0000000..c6539ba --- /dev/null +++ b/src/main/scala/io/izzel/taboolib/common/plugin/bridge/BridgeImpl.java @@ -0,0 +1,54 @@ +package io.izzel.taboolib.common.plugin.bridge; + +import com.sk89q.worldguard.WorldGuard; +import com.sk89q.worldguard.bukkit.WorldGuardPlugin; +import io.izzel.taboolib.common.plugin.InternalPluginBridge; +import me.clip.placeholderapi.PlaceholderAPI; +import net.milkbowl.vault.economy.Economy; +import net.milkbowl.vault.permission.Permission; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.plugin.RegisteredServiceProvider; + +import java.util.List; + +public class BridgeImpl extends InternalPluginBridge { + + @Override + public String setPlaceholders(Player player, String args) { + return PlaceholderAPI.setPlaceholders(player, args); + } + + @Override + public List setPlaceholders(Player player, List args) { + return PlaceholderAPI.setPlaceholders(player, args); + } + + @Override + public Economy getEconomy() { + if (Bukkit.getPluginManager().getPlugin("Vault") == null) { + return null; + } + RegisteredServiceProvider registration = Bukkit.getServer().getServicesManager().getRegistration(Economy.class); + return registration != null ? registration.getProvider() : null; + } + + @Override + public Permission getPermission() { + if (Bukkit.getPluginManager().getPlugin("Vault") == null) { + return null; + } + RegisteredServiceProvider registration = Bukkit.getServer().getServicesManager().getRegistration(Permission.class); + return registration != null ? registration.getProvider() : null; + } + + @Override + public WorldGuard getWorldGuard() { + return WorldGuard.getInstance(); + } + + @Override + public WorldGuardPlugin getWorldGuardPlugin() { + return WorldGuardPlugin.inst(); + } +} \ No newline at end of file diff --git a/src/main/scala/io/izzel/taboolib/common/plugin/bridge/BridgeLoader.java b/src/main/scala/io/izzel/taboolib/common/plugin/bridge/BridgeLoader.java new file mode 100644 index 0000000..93bccf6 --- /dev/null +++ b/src/main/scala/io/izzel/taboolib/common/plugin/bridge/BridgeLoader.java @@ -0,0 +1,46 @@ +package io.izzel.taboolib.common.plugin.bridge; + +import io.izzel.taboolib.util.Reflection; +import org.bukkit.Bukkit; + +import java.lang.reflect.Method; + +/** + * @Author 坏黑 + * @Since 2019-07-09 17:43 + */ +public class BridgeLoader extends ClassLoader { + + private static Method findClass; + private static ClassLoader pluginClassLoader; + + public static BridgeLoader getInstance() { + return new BridgeLoader(); + } + + private BridgeLoader() { + super(BridgeLoader.class.getClassLoader()); + try { + findClass = Reflection.getMethod(ClassLoader.class, "findClass", String.class); + pluginClassLoader = Bukkit.getPluginManager().getPlugins()[0].getClass().getClassLoader(); + } catch (Throwable t) { + t.printStackTrace(); + } + } + + @Override + protected Class findClass(String name) throws ClassNotFoundException { + try { + Object o = findClass.invoke(pluginClassLoader, name); + if (o != null) { + return (Class) o; + } + } catch (Throwable ignored) { + } + return super.findClass(name); + } + + public static Class createNewClass(String name, byte[] arr) { + return getInstance().defineClass(name, arr, 0, arr.length, BridgeLoader.class.getProtectionDomain()); + } +} diff --git a/src/main/scala/io/izzel/taboolib/module/compat/EconomyHook.java b/src/main/scala/io/izzel/taboolib/module/compat/EconomyHook.java index 20cc306..07c992f 100644 --- a/src/main/scala/io/izzel/taboolib/module/compat/EconomyHook.java +++ b/src/main/scala/io/izzel/taboolib/module/compat/EconomyHook.java @@ -1,10 +1,9 @@ package io.izzel.taboolib.module.compat; +import io.izzel.taboolib.common.plugin.InternalPluginBridge; import io.izzel.taboolib.module.inject.TFunction; import net.milkbowl.vault.economy.Economy; -import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; -import org.bukkit.plugin.RegisteredServiceProvider; /** * @Author 坏黑 @@ -16,13 +15,7 @@ public class EconomyHook { private static Economy economy; static void init() { - if (Bukkit.getPluginManager().getPlugin("Vault") == null) { - return; - } - RegisteredServiceProvider l = Bukkit.getServer().getServicesManager().getRegistration(Economy.class); - if (l != null) { - economy = l.getProvider(); - } + economy = InternalPluginBridge.handle().getEconomy(); } public static void remove(OfflinePlayer p, double d) { diff --git a/src/main/scala/io/izzel/taboolib/module/compat/PermissionHook.java b/src/main/scala/io/izzel/taboolib/module/compat/PermissionHook.java index b2bc5d5..3ccc7ae 100644 --- a/src/main/scala/io/izzel/taboolib/module/compat/PermissionHook.java +++ b/src/main/scala/io/izzel/taboolib/module/compat/PermissionHook.java @@ -1,10 +1,9 @@ package io.izzel.taboolib.module.compat; +import io.izzel.taboolib.common.plugin.InternalPluginBridge; import io.izzel.taboolib.module.inject.TFunction; import net.milkbowl.vault.permission.Permission; -import org.bukkit.Bukkit; import org.bukkit.entity.Player; -import org.bukkit.plugin.RegisteredServiceProvider; import java.util.Arrays; @@ -14,11 +13,7 @@ public class PermissionHook { private static Permission perms; static void init() { - if (Bukkit.getPluginManager().getPlugin("Vault") == null) { - return; - } - RegisteredServiceProvider rsp = Bukkit.getServer().getServicesManager().getRegistration(Permission.class); - perms = rsp.getProvider(); + perms = InternalPluginBridge.handle().getPermission(); } public static Permission getPermission() { diff --git a/src/main/scala/io/izzel/taboolib/module/compat/PlaceholderHook.java b/src/main/scala/io/izzel/taboolib/module/compat/PlaceholderHook.java index 17efce8..a778ba9 100644 --- a/src/main/scala/io/izzel/taboolib/module/compat/PlaceholderHook.java +++ b/src/main/scala/io/izzel/taboolib/module/compat/PlaceholderHook.java @@ -1,6 +1,6 @@ package io.izzel.taboolib.module.compat; -import me.clip.placeholderapi.PlaceholderAPI; +import io.izzel.taboolib.common.plugin.InternalPluginBridge; import io.izzel.taboolib.module.inject.TFunction; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; @@ -9,36 +9,17 @@ import org.bukkit.entity.Player; @TFunction(enable = "init") public abstract class PlaceholderHook { - private static PlaceholderHook impl; + private static boolean hooked; static void init() { - if (Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null) { - impl = new PlaceholderImpl(); - } else { - impl = new AbstractImpl(); - } + hooked = Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null; } public static String replace(CommandSender sender, String text) { - return sender instanceof Player ? impl.replace(((Player) sender), text) : text; + return sender instanceof Player && hooked ? InternalPluginBridge.handle().setPlaceholders((Player) sender, text) : text; } - abstract String replace(Player player, String text); - - private static class PlaceholderImpl extends PlaceholderHook { - - @Override - String replace(Player player, String text) { - return PlaceholderAPI.setPlaceholders(player, text); - } + public static boolean isHooked() { + return hooked; } - - private static class AbstractImpl extends PlaceholderHook { - - @Override - String replace(Player player, String text) { - return text; - } - } - } diff --git a/src/main/scala/io/izzel/taboolib/module/compat/WorldGuardHook.java b/src/main/scala/io/izzel/taboolib/module/compat/WorldGuardHook.java index 1b43426..ffb07ae 100644 --- a/src/main/scala/io/izzel/taboolib/module/compat/WorldGuardHook.java +++ b/src/main/scala/io/izzel/taboolib/module/compat/WorldGuardHook.java @@ -1,12 +1,10 @@ package io.izzel.taboolib.module.compat; -import com.google.common.base.Preconditions; import com.sk89q.worldedit.bukkit.BukkitAdapter; -import com.sk89q.worldguard.WorldGuard; import com.sk89q.worldguard.bukkit.WorldGuardPlugin; import com.sk89q.worldguard.protection.managers.RegionManager; import com.sk89q.worldguard.protection.regions.ProtectedRegion; -import org.bukkit.Bukkit; +import io.izzel.taboolib.common.plugin.InternalPluginBridge; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.entity.Player; @@ -26,8 +24,7 @@ public class WorldGuardHook { private Method getRegionManager; public WorldGuardHook() { - Preconditions.checkNotNull(Bukkit.getServer().getPluginManager().getPlugin("WorldGuard"), "WorldGuard was not found."); - worldGuard = WorldGuardPlugin.inst(); + worldGuard = InternalPluginBridge.handle().getWorldGuardPlugin(); if (!worldGuard.getDescription().getVersion().startsWith("7")) { try { getRegionManager = WorldGuardPlugin.class.getDeclaredMethod("getRegionManager", World.class); @@ -44,7 +41,7 @@ public class WorldGuardHook { public RegionManager getRegionManager(World world) { if (worldGuard.getDescription().getVersion().startsWith("7")) { - return WorldGuard.getInstance().getPlatform().getRegionContainer().get(BukkitAdapter.adapt(world)); + return InternalPluginBridge.handle().getWorldGuard().getPlatform().getRegionContainer().get(BukkitAdapter.adapt(world)); } else { try { return (RegionManager) getRegionManager.invoke(worldGuard, world); diff --git a/src/main/scala/io/izzel/taboolib/module/db/source/DBSource.java b/src/main/scala/io/izzel/taboolib/module/db/source/DBSource.java index 874f47c..58b8c68 100644 --- a/src/main/scala/io/izzel/taboolib/module/db/source/DBSource.java +++ b/src/main/scala/io/izzel/taboolib/module/db/source/DBSource.java @@ -2,12 +2,12 @@ package io.izzel.taboolib.module.db.source; import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; -import io.izzel.taboolib.module.locale.TLocale; import io.izzel.taboolib.module.config.TConfig; -import io.izzel.taboolib.module.inject.TInject; import io.izzel.taboolib.module.db.IHost; import io.izzel.taboolib.module.db.sql.SQLHost; import io.izzel.taboolib.module.db.sqlite.SQLiteHost; +import io.izzel.taboolib.module.inject.TInject; +import io.izzel.taboolib.module.locale.TLocale; import org.bukkit.configuration.file.FileConfiguration; import javax.sql.DataSource; diff --git a/src/main/scala/io/izzel/taboolib/module/lite/SimpleVersionControl.java b/src/main/scala/io/izzel/taboolib/module/lite/SimpleVersionControl.java index 2e52361..4ed70c7 100644 --- a/src/main/scala/io/izzel/taboolib/module/lite/SimpleVersionControl.java +++ b/src/main/scala/io/izzel/taboolib/module/lite/SimpleVersionControl.java @@ -3,7 +3,9 @@ package io.izzel.taboolib.module.lite; import com.google.common.collect.Lists; import io.izzel.taboolib.TabooLib; import io.izzel.taboolib.Version; +import io.izzel.taboolib.common.plugin.bridge.BridgeLoader; import io.izzel.taboolib.util.Files; +import io.izzel.taboolib.util.Ref; import io.izzel.taboolib.util.asm.AsmClassLoader; import org.bukkit.plugin.Plugin; import org.objectweb.asm.ClassReader; @@ -126,6 +128,20 @@ public class SimpleVersionControl { return newClass; } + public Class translateBridge() throws IOException { + Class callerClass = Ref.getCallerClass(3).orElse(null); + if (callerClass != null && !callerClass.getName().startsWith("io.izzel")) { + throw new IllegalStateException(); + } + ClassReader classReader = new ClassReader(Files.getTabooLibResource(target.replace(".", "/") + ".class")); + ClassWriter classWriter = new ClassWriter(0); + ClassVisitor classVisitor = new SimpleClassVisitor(this, classWriter); + classReader.accept(classVisitor, ClassReader.EXPAND_FRAMES); + classWriter.visitEnd(); + classVisitor.visitEnd(); + return BridgeLoader.createNewClass(target, classWriter.toByteArray()); + } + // ********************************* // // Getter and Setter diff --git a/src/main/scala/io/izzel/taboolib/module/locale/TLocale.java b/src/main/scala/io/izzel/taboolib/module/locale/TLocale.java index 7620c9d..390c615 100644 --- a/src/main/scala/io/izzel/taboolib/module/locale/TLocale.java +++ b/src/main/scala/io/izzel/taboolib/module/locale/TLocale.java @@ -1,6 +1,7 @@ package io.izzel.taboolib.module.locale; import io.izzel.taboolib.TabooLib; +import io.izzel.taboolib.module.compat.PlaceholderHook; import io.izzel.taboolib.module.locale.logger.TLoggerManager; import io.izzel.taboolib.module.nms.NMS; import io.izzel.taboolib.module.tellraw.TellrawCreator; @@ -9,7 +10,6 @@ import io.izzel.taboolib.util.Strings; import io.izzel.taboolib.util.chat.ChatColor; import io.izzel.taboolib.util.chat.ComponentSerializer; import io.izzel.taboolib.util.chat.TextComponent; -import me.clip.placeholderapi.PlaceholderAPI; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -111,7 +111,7 @@ public class TLocale { } public static boolean isPlaceholderPluginEnabled() { - return Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null && Bukkit.getPluginManager().getPlugin("PlaceholderAPI").isEnabled(); + return PlaceholderHook.isHooked(); } public static String setColored(String args) { @@ -131,11 +131,11 @@ public class TLocale { } public static String setPlaceholders(CommandSender sender, String args) { - return isPlaceholderPluginEnabled() ? sender instanceof Player ? PlaceholderAPI.setPlaceholders((Player) sender, args) : args : args; + return PlaceholderHook.replace(sender, args); } public static List setPlaceholders(CommandSender sender, List args) { - return isPlaceholderPluginEnabled() ? sender instanceof Player ? PlaceholderAPI.setPlaceholders((Player) sender, args) : args : args; + return args.stream().map(var -> PlaceholderHook.replace(sender, var)).collect(Collectors.toList()); } }